73

我的 Unix 机器上有一些文件以

 --

例如--testings.html

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

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

我试过

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

但没有任何效果。

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

4

7 回答 7

150
rm -- --testings.html

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

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

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

于 2009-04-01T15:59:20.217 回答
56
rm -- --somefile

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

正因为如此,你应该穿过你的头骨的解决方案是这个:

rm ./--somefile

它总是有效的,因为这样你的论点永远不会以-.

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

于 2009-04-01T19:10:56.293 回答
18

要么rm -- --testings.html要么rm ./--testings.html

于 2009-04-01T16:01:45.967 回答
7
rm -- --testings.html
于 2009-04-01T15:59:14.943 回答
4

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

touch -- --file 
find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete 
于 2009-04-02T10:43:43.867 回答
3

对于删除文件名中包含不可能字符的文件的更通用方法,一种选择是使用文件的 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 \{\} \;

在处理具有文件名特性的大量文件时,此过程可能很有用,因为它可以很容易地编写脚本。

于 2009-05-22T18:56:30.357 回答
1
rm ./--testings.html

或者

rm -- --testings.html
于 2009-04-01T16:03:02.127 回答