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

我的 Unix 机器上有一些文件

 --

例如 --testings.html

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

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

我尽力了

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

但什么都没用。

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

16337 次浏览
rm -- --testings.html
rm -- --testings.html

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

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

Http://www.gnu.org/software/hello/manual/libc/using-getopt.html#using-getopt

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

rm ./--testings.html

或者

rm -- --testings.html
rm -- --somefile

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

正因为如此,你应该用这个办法来解决这个问题:

rm ./--somefile

它将始终工作,因为这样你的论点从来没有一个 -开始。

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

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

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

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

它可以通过 ls -i获得。

例如:。

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

当处理大量具有文件名特性的文件时,这个过程可能是有益的,因为它可以很容易地编写脚本。