如何删除以双连字符开头的文件?


70

我的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上相同。
多里安

1
@Dorian好吧,但是我是第一个:)
cb0

Answers:


145
rm -- --testings.html

--选项告诉rm将所有其他参数视为文件名,而不是选项,即使它们以开头-

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

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


5
尽管在大多数版本上都可以使用,但这并不是所有Unix版本的标准配置。有关适用于所有版本的替代方法,请参见vatine的答案。
斯蒂芬·达林顿

56
rm -- --somefile

在这种情况下,这是一种依靠rm使用getopts解析其选项的解决方案。那里有一些应用程序自己进行解析,并且也会对此进行呕吐(因为它们可能不一定实现“--选项的均值”逻辑)。

因此,您应该开车穿过头骨的解决方案是:

rm ./--somefile

它将始终有效,因为这样您的参数就永远不会以开头-

此外,如果您要制作真正体面的Shell脚本,请参阅。从技术上讲,您应该将./所有文件名参数扩展放在最前面,以防止脚本由于文件名输入的时髦而损坏(或防止脚本被滥用/利用来执行不应做的事情:例如,rm将删除文件但是跳过目录;同时rm -rf *会删除所有内容。将“ -rf”文件名传递给脚本或某人touch ~victim/-rf的ing可能会以这种方式用于更改其行为,从而带来严重的后果。


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

17

无论是rm -- --testings.htmlrm ./--testings.html



4

另一方法是使用find ... -name“-*” -delete

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

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

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


1
之所以起作用,是因为它rm使用参数调用./--testings.html。只需rm ./--testings.html直接键入会更容易-这也不需要遍历整个目录树。(您可以通过使用来避免后者-maxdepth 1。)
Keith Thompson

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.