今日分享: 我们在肉体的疾病方面花了不少钱, 精神的病害方面却没有花什么, 现在已经到了时候, 我们应该有不平凡的学校.--《瓦尔登湖》
前言
我们都知道, 在 Linux 删除一个文件可以使用 rm 命令, 但是有一些特殊名称的文件使用普通的 rm 方式却没法删除, 本文介绍 Linux 中删除特殊名称文件的多种方式.
Linux 文件命名规则
在介绍之前, 简单说明一下 Linux 中文件命名规则. 文件或目录名由除 "/" 和空字符 "\0" 之外的任意 ASCII 字符序列组成. 当然很多操作系统允许更多类型的字符组成文件名. 但对于我们来说, 从来不建议使用一些特殊字符来命名文件. 不幸的是, 我们可能无意中创建了一些特殊名称的文件, 或者由程序意外的创建了一些由特殊字符组成的文件. 这个时候, 要删除它们, 似乎没有想象中的那么简单.
删除时带上路径
假设有一个名为 - static 文件, 我们使用普通方式将它删除:
- $ rm -static
- rm: invalid option -- 's'
- Try 'rm ./-static' to remove the file '-static'.
- Try 'rm --help' for more information.
非常可惜, 这种方式提示出错, 并不能成功地删除 - static 文件. 这是为什么? 我们知道在 Linux 中, 通常以 - 开头, 后面跟一些字符, 作为一个命令的选项, 而不巧的,-static 就被 rm 命令认为是一个参数选项, 更不幸的是, 实际上并没有该选项, 因此最终提示 invalid option -- 's', 导致 - static 文件无法删除.
那么有没有什么办法删除呢? 我们注意到, 除了提示非法选项外, 还让我们尝试 rm ./-static, 是否可以呢? 我们试一下:
$ rm ./-static
$
最终发现, 我们将 - static 文件成功删除了. 因此得到我们的第一种方式, 删除文件时带上路径.
删除时使用 --
前面除了提示让我们使用 rm ./-static 之外, 还让我们使用 rm --help 获取更多信息, 那么我们就看一下:
- $ rm --help
- (省略部分内容)
- To remove a file whose name starts with a '-', for example '-foo',
- use one of these commands:
- rm -- -foo
- rm ./-foo
- (省略部分内容)
内容较多, 但是可以注意到上面的内容, 对于以 - 开头的文件, 提供了两种删除方式, 第二种是前面提到的, 而第二种, 是在删除的文件前面再加 --:
- $ rm -- -static
- $
我们发现这种方式也是可以删除以 - 开头的文件.
删除时用引号引起来
对于特殊字符, 如<>!* 等组成的文件如何删除呢? 例如:
- $ rm <>\!*
- rm: missing operand
- Try 'rm --help' for more information.
对于这种类型的文件, 我们需要用引号将文件名包含起来:
$ rm "<>\!*"
$
这样就可以删除掉了, 但是这种方式并不能针对所有该类型的文件, 例如, 文件名为!* 的文件就不能通过这样的方式删除, 因为!* 是有其他含义的, 具体可参看《Linux 中! 的惊叹用法 https://www.huyanbing.me/2018/12/22/40915.html 》.
增加转义字符删除文件
既然!* 无法通过加引号的方式删除, 那还有什么办法吗? 有! 删除时, 增加转义字符:
$ rm \!*
$
这样便可以删除. 在 Linux 中, 很多字符有着特殊的含义, 因此当你需要把它当普通字符使用时, 就需要在前面加上 \ 转义字符, 这和 C 语言中的转义有点类似. 再举个例子, 要删除以空格开头的 abc 文件, 可以使用下面的方式:
$ rm \ abc
$
即可成功删除.
按照 i 节点号删除
很多时候, 文件名压根没法输入, 因为它们都是一堆乱码. 因此也完全无法通过前面介绍的方法进行删除, 那还有办法吗? 有! 通过查找文件的 i 节点, 按照 i 节点进行删除.
例如:
- $ ls -i #找到乱码文件的 i 节点号
- 1703907 ç¼?ç¨?ç? ç??é«?æ¸?PDFç??.PDF
- $ find ./ -inum 1703907 -exec rm {
- } \; #或者使用 - delete 参数
关于 find 命令用法, 可参考《find 命令高级用法 https://www.huyanbing.me/2018/12/15/21083.html 》. 这种通过 i 节点号进行删除的方式适用于前面所提到的任何类型文件.
这里扩展说几句. 在操作系统中, 它是如何识别一个文件的呢? 它并不是通过文件名, 而是通过一个 iNode 号, 即 i 节点号来识别不同的文件, 文件名不过是这个文件其中的一个属性而已.
使用通配符删除
不多解释:
$ rm *.PDF
$
但是这种方式可能存在误删, 因为只要文件名结尾为. PDF 就会被删除, 因此根据实际情况慎重使用.
总结
删除特殊文件名称的方法有很多, 总结如下:
删除时带上路径
删除时使用 --
删除时用引号引起来
使用转义字符辅助删除
按照 i 节点号删除
使用通配符删除
不同类型文件可选择使用上面所提较方便的方式进行删除.
微信公众号 [编程珠玑] : 专注但不限于分享计算机编程基础, Linux,C 语言, C++, 算法, 数据库等编程相关[原创] 技术文章, 号内包含大量经典电子书和视频学习资源. 欢迎一起交流学习, 一起修炼计算机 "内功", 知其然, 更知其所以然.
来源: https://www.cnblogs.com/bianchengzhuji/p/10305781.html