我的 Unix 机器上有一些文件
--
例如 --testings.html
--testings.html
如果我尝试删除它,我会得到以下错误:
cb0$ rm --testings.html rm: illegal option -- - usage: rm [-f | -i] [-dPRrvW] file ... unlink file
我尽力了
rm "--testings.html" || 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 -- --somefile
虽然这种方法有效,但它是一种依赖于使用 getopts 解析其选项的 rm的解决方案。有些应用程序可以自己解析,而且也会对此感到厌烦(因为它们可能不一定实现“ --意味着结束选项”逻辑)。
rm
正因为如此,你应该用这个办法来解决这个问题:
rm ./--somefile
它将始终工作,因为这样你的论点从来没有一个 -开始。
此外,如果你正在尝试制作真正像样的 shell 脚本; 从技术上讲,你应该把 ./放在所有文件名参数扩展的前面,以防止你的脚本由于时髦的文件名输入而中断(或者防止它们被滥用/被利用来做它们不应该做的事情: 例如,rm会删除文件但跳过目录; 而 rm -rf *会删除所有文件。将文件名“ -rf”传递给脚本或某人 touch ~victim/-rf‘ ing 可能会以这种方式用于改变其行为,从而带来非常糟糕的后果)。
./
rm -rf *
-rf
touch ~victim/-rf
另一种方法是使用 find...-name“—— *”-delete
touch -- --file find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete
对于删除文件名中包含不可能字符的文件的更通用方法,一种选择是使用文件的 inode。
它可以通过 ls -i获得。
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 \{\} \;
当处理大量具有文件名特性的文件时,这个过程可能是有益的,因为它可以很容易地编写脚本。