我的Unix机器上有一些以
开头的文件 --
e.g。 --testings.html
如果我尝试删除它,我会收到以下错误:
cb0$ rm --testings.html
rm: illegal option -- -
usage: rm [-f | -i] [-dPRrvW] file ...
unlink file
我试过
rm "--testings.html" || rm '--testings.html'
但没有任何作用。
如何在终端上删除此类文件?
答案 0 :(得分:141)
rm -- --testings.html
--
选项告诉rm将所有其他参数视为文件名,而不是选项,即使它们以-
开头。
这不是rm命令特有的。 getopt函数实现了它,并且许多(所有?)UNIX样式命令以相同的方式处理它:--
终止选项处理,以及它之后的任何内容都是常规参数。
http://www.gnu.org/software/hello/manual/libc/Using-Getopt.html#Using-Getopt
答案 1 :(得分:55)
rm -- --somefile
虽然这有效,但它是一个依赖rm
使用getopts解析其选项的解决方案。有些应用程序可以自己进行解析并且也会对此进行解释(因为它们可能不一定实现“--
意味着结束选项”逻辑)。
因此,你应该通过头骨开车的解决方案是:
rm ./--somefile
它始终有效,因为这样你的参数永远不会以-
开头。
此外,如果您正在尝试制作非常体面的shell脚本;你应该在技术上将./
放在所有文件名参数扩展的前面,以防止脚本因文件名输入而破坏(或防止它们被滥用/利用来做他们不应该做的事情:for例如,rm
将删除文件但跳过目录;而rm -rf *
将删除所有内容。将文件名“-rf
”传递给脚本或某人touch ~victim/-rf
可能会这种方式可以用来改变它的行为而带来非常糟糕的后果。)
答案 2 :(得分:17)
rm -- --testings.html
或rm ./--testings.html
。
答案 3 :(得分:7)
rm -- --testings.html
答案 4 :(得分:4)
另一种方法是使用find ... -name“ - *” - delete
touch -- --file
find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete
答案 5 :(得分:3)
对于删除文件名中包含不可能字符的文件的更通用方法,一种选择是使用文件的inode。
可以通过ls -i
获得。
e.g。
$ ls -lai | grep -i test
452998712 -rw-r--r-- 1 dim dim 6 2009-05-22 21:50 --testings.html
并在查找的帮助下删除它:
$ find ./ -inum 452998712 -exec rm \{\} \;
这个过程在处理大量具有文件名特性的文件时非常有用,因为它可以很容易编写脚本。
答案 6 :(得分:1)
rm ./--testings.html
或
rm -- --testings.html