如何删除以双短横线开头的文件?

75

我在我的 Unix 机器上有一些以

开头的文件。

 --

例如:--testings.html

如果我试图将其移除,我会收到以下错误:

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

我尝试过

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

但一切方法都无效。

我该如何在终端上删除这些文件?


serverfaultunix上相同的问题。 - Dorian
1
@Dorian 好的,但我先来了 :) - cb0
7个回答

152
rm -- --testings.html

-- 选项告诉 rm 命令将所有后续参数视为文件名,而不是选项,即使它们以 - 开头。

这不仅适用于 rm 命令。getopt 函数实现了它,许多 (所有?) 类 UNIX 命令都以相同的方式处理它: -- 终止选项处理,其后的任何内容均为常规参数。

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


5
这并不是所有 Unix 版本都采用的标准,尽管它可以在大多数版本上运行。如果想要一个在所有版本上都能工作的替代方法,请参考 vatine 的回答。 - Stephen Darlington

56
rm -- --somefile

虽然那样做可以解决问题,但这种解决方案依赖于rm使用getopts来解析其选项。实际上有些应用程序不使用这种逻辑(因为它们可能没有实现“--表示选项结束”的逻辑),会因此而出错。

因此,你应该铭记的解决方案是:

rm ./--somefile

这种写法总是有效的,因为这样你的参数永远不会以-开头。

此外,如果您想创建真正好的shell脚本,则应该在所有文件名参数扩展前面技术性地放置./,以防止由于奇怪的文件名输入而导致脚本崩溃(或者防止它们被滥用/利用以执行其不应执行的操作:例如,rm将删除文件但跳过目录;而rm -rf *将删除一切。以这种方式传递一个文件名"-rf"给脚本或某人touch ~victim/-rf可能被用来改变它的行为,从而产生非常严重的后果)。


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

18
无论是使用rm -- --testings.html还是rm ./--testings.html,都可以删除文件。

7
rm -- --testings.html

4
另一种方法是使用find命令... -name“--*”-delete来完成。
touch -- --file 
find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete 

3

如果您需要删除文件名中包含不合法字符的文件,一种更通用的方法是使用文件的inode。

可以通过ls -i命令获取到文件的inode。

例如:

$ 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 \{\} \;

当处理大量具有文件名特殊性的文件时,此过程非常有益,因为它可以轻松地编写脚本。


1
这只能工作是因为它使用 rm 带参数 ./--testings.html 调用了它。直接输入 rm ./--testings.html 更容易 -- 这也不需要遍历整个目录树。(您可以使用 -maxdepth 1 避免遍历整个目录树。) - Keith Thompson

2
rm ./--testings.html

或者

rm -- --testings.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接