答案 0 :(得分:7)
rm ./-rf
和/或rm -- -rf
将尝试删除名为的文件,具体为-rf
这里唯一的技巧是你通常无法删除以“ - ”开头的文件,因为该命令将假定它是一个命令参数。通过在文件前面加上完整路径,或者使用--
选项(这意味着,结束所有选项),命令将不再认为它是一个参数。
应该注意的是,此技巧的--
版本可能也可能不适用于所有shell命令,因此最好使用第一个版本。
答案 1 :(得分:7)
如果您的目录中有一个名为-rf
的文件,如果您不知道该技巧,则很难删除该文件。那是因为:
rm -rf
提供两个命令行选项(-r
和-f
)作为单个参数,并告诉rm
递归并强制删除内容。
如果你写:
rm ./-rf
该参数不再以短划线开头,因此它只是一个文件名。类似地,通过常见(但不是通用)约定,--
标记选项参数的结束,之后的任何内容都不再是一个选项(通常意味着它是文件名)。所以:
rm -- -rf
删除该文件,因为rm
知道--
后面的参数是文件名,而不是它要处理的选项。
如果使用通配符,文件-rf
会更加危险:
rm *rf*
突然间,这将删除目录和文件(但不会损害文件-rf
)。
答案 2 :(得分:1)
不是一个完整的答案,因为我认为其他答案给出了很好的解释。
当我不确定给定的rm
调用将要删除的内容时,我会首先记住简单地ls
文件列表,以确保它实际上是我要删除的内容:< / p>
$ ls -rf -rf .. . $
好的,显然不对,让我们再试一次:
$ ls ./-rf ./-rf $
好多了。让ls
使用rm -v
(-v
进行额外的偏执/检查)替换-rf
,并进行实际删除:
$ rm -v !!:* rm -v ./-rf removed `./-rf' $
当你不确定扩展是什么时,这也适用于通配符,大括号扩展等。
另外,如果你想知道如何创建像{{1}}这样的文件,那么如果你搞砸了一个重定向就会非常容易:
$ ls $ echo > -rf $ ls -rf $