【问题标题】:How to remove files starting with double hyphen?如何删除以双连字符开头的文件?
【发布时间】:2010-10-16 21:53:27
【问题描述】:

我的 Unix 机器上有一些以

开头的文件
 --

例如--testings.html

如果我尝试删除它,我会收到以下错误:

cb0$ rm --testings.html
rm: illegal option -- -
usage: rm [-f | -i] [-dPRrvW] file ...
       unlink file

我试过了

rm "--testings.html" || rm '--testings.html' 

但没有任何效果。

如何在终端上删除此类文件?

【问题讨论】:

标签: bash unix filenames


【解决方案1】:
rm -- --testings.html

-- 选项告诉 rm 将所有进一步的参数视为文件名,而不是选项,即使它们以 - 开头。

这不是 rm 命令所特有的。 getopt 函数实现了它,许多(全部?)UNIX 风格的命令都以同样的方式对待它:-- 终止选项处理,它之后的任何内容都是常规参数。

http://www.gnu.org/software/hello/manual/libc/Using-Getopt.html#Using-Getopt

【讨论】:

  • 这不是所有 Unix 版本的标准,尽管它适用于大多数版本。有关适用于所有版本的替代方案,请参阅 vatine 的答案。
【解决方案2】:
rm -- --somefile

虽然可行,但它是一个依赖于 rm 的解决方案,使用 getopts 来解析其选项。有些应用程序会进行自己的解析,并且也会对此感到厌烦(因为它们可能不一定实现“-- 表示选项结束”逻辑)。

因此,您应该通过头骨的解决方案是这个:

rm ./--somefile

它将始终有效,因为这样您的论点就不会以 - 开头。

此外,如果您正在尝试制作真正不错的 shell 脚本;从技术上讲,您应该将./ 放在所有文件名参数扩展的前面,以防止您的脚本由于时髦的文件名输入而中断(或防止它们被滥用/利用来做他们不应该做的事情:例如, rm 将删除文件但跳过目录;而rm -rf * 将删除所有内容。将“-rf”的文件名传递给脚本或某人touch ~victim/-rf'ing 可以通过这种方式用于改变其行为不良后果)。

【讨论】:

  • +1 因为你是对的,但是除了处理一个尴尬的文件名之外,使脚本防弹是另一个问题。如果问题是“我如何删除以连字符开头或包含空格、;、、$ 和其他恶意垃圾的文件”,那么它需要完整的答案:-)
【解决方案3】:

rm -- --testings.htmlrm ./--testings.html

【讨论】:

    【解决方案4】:
    rm -- --testings.html
    

    【讨论】:

      【解决方案5】:

      另一种方法是使用 find ... -name "--*" -delete

      touch -- --file 
      find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete 
      

      【讨论】:

        【解决方案6】:

        对于删除文件名中包含不可能字符的文件的更通用方法,一种选择是使用文件的 inode。

        可以通过ls -i获取。

        例如

        $ ls -lai | grep -i test
        452998712 -rw-r--r--  1 dim   dim      6 2009-05-22 21:50 --testings.html
        

        并在 find 的帮助下删除它:

        $ find ./ -inum 452998712 -exec rm \{\} \;
        

        此过程在处理大量具有文件名特征的文件时非常有用,因为它可以轻松编写脚本。

        【讨论】:

        • 这只是因为它使用参数./--testings.html 调用rm。直接输入rm ./--testings.html 更容易——这也不需要遍历整个目录树。 (您可以使用-maxdepth 1 避免后者。)
        【解决方案7】:
        rm ./--testings.html
        

        rm -- --testings.html
        

        【讨论】:

          最近更新 更多