【问题标题】:Explaining the rm ./-rf "trick"解释 rm ./-rf “技巧”
【发布时间】:2014-01-05 14:01:18
【问题描述】:

This question 状态:

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

我不敢尝试这些,但很好奇它们的作用。它们也很难搜索...

谁能启发我?

【问题讨论】:

  • “它们也很难搜索......” - 是的,谷歌倾向于忽略所有标点符号。但是symbolhound.com 有一个专门用于标点符号的搜索引擎,它是由另一个 SO 用户创建的。搜索 rm -- 结果产生 this question 作为第四个结果,其答案解释了这两种情况。

标签: bash unix command-line rm


【解决方案1】:

rm ./-rf 和/或rm -- -rf 将尝试删除名为-rf 的文件

这里唯一的技巧是您通常不能删除以“-”开头的文件,因为该命令将假定它是一个命令参数。通过在文件前面加上完整路径,或使用 -- 选项(这意味着结束所有选项),命令将不再假定它是一个参数。

需要注意的是,这个技巧--版本可能也适用于所有shell命令,也可能不适用,所以最好使用第一个版本。

【讨论】:

  • shell 不对命令参数做任何假设;它只是让他们通过。将-rf 解释为控制选项而不是文件名的是rm 命令本身。
  • 你说得对@JonathanLeffler,我已经更新了答案以澄清。
【解决方案2】:

如果您的目录中有一个名为-rf 的文件,如果您不知道其中的技巧,则很难删除该文件。那是因为:

rm -rf

提供两个命令行选项(-r-f)作为单个参数,并告诉rm 以递归方式强制删除内容。

如果你写:

rm ./-rf

参数不再以破折号开头,所以它只是一个文件名。同样,按照通用(但不是通用)约定,-- 标记选项参数的结尾,之后的任何内容都不再是选项(通常意味着它是文件名)。所以:

rm -- -rf

删除文件,因为rm 知道-- 后面的参数是文件名,而不是它要处理的选项。

如果使用通配符,文件-rf 会更加危险:

rm *rf*

突然之间,这将删除目录和文件(但不会损害文件-rf)。

【讨论】:

  • 哇,rm *rf* 没有 达到我的预期。通配符作为选项!太可怕了!
【解决方案3】:

不是一个完整的答案,因为我认为其他答案给出了很好的解释。

当我不确定给定的rm 调用将要删除什么时,我会尽量记住首先简单地ls 文件列表以确保它实际上是我想要删除的:

$ ls -rf -rf ... $

好吧,显然不对,让我们再试一次:

$ ls ./-rf ./-rf $

这样更好。让我们用rm -v 替换ls 的历史记录(-v 只是为了额外的偏执/检查)并进行实际删除:

$ rm -v !!:* rm -v ./-rf 删除了`./-rf' $

当您不确定扩展究竟是什么时,这也适用于通配符、大括号扩展等。


此外,如果您想知道如何首先创建像 -rf 这样的文件,如果您稍微弄乱了重定向,它会非常容易:

$ ls $ 回声 > -rf $ ls -rf $

【讨论】:

    猜你喜欢
    • 2011-02-28
    • 2021-04-09
    • 2013-01-10
    • 2012-05-13
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2015-10-06
    相关资源
    最近更新 更多