解释rm ./-rf“技巧”

时间:2013-12-17 17:08:39

标签: bash unix command-line rm

This question州:

  

令人惊讶的是,有多少用户不了解rm ./-rfrm -- -rf技巧。

我害怕尝试这些,但对他们的所作所为感到好奇。他们也很难搜索......

有人可以启发我吗?

3 个答案:

答案 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
$