【发布时间】:2014-01-05 14:01:18
【问题描述】:
【问题讨论】:
-
“它们也很难搜索......” - 是的,谷歌倾向于忽略所有标点符号。但是symbolhound.com 有一个专门用于标点符号的搜索引擎,它是由另一个 SO 用户创建的。搜索
rm --结果产生 this question 作为第四个结果,其答案解释了这两种情况。
标签: bash unix command-line rm
【问题讨论】:
rm -- 结果产生 this question 作为第四个结果,其答案解释了这两种情况。
标签: bash unix command-line rm
rm ./-rf 和/或rm -- -rf 将尝试删除名为-rf 的文件
这里唯一的技巧是您通常不能删除以“-”开头的文件,因为该命令将假定它是一个命令参数。通过在文件前面加上完整路径,或使用 -- 选项(这意味着结束所有选项),命令将不再假定它是一个参数。
需要注意的是,这个技巧的--版本可能也适用于所有shell命令,也可能不适用,所以最好使用第一个版本。
【讨论】:
-rf 解释为控制选项而不是文件名的是rm 命令本身。
如果您的目录中有一个名为-rf 的文件,如果您不知道其中的技巧,则很难删除该文件。那是因为:
rm -rf
提供两个命令行选项(-r 和-f)作为单个参数,并告诉rm 以递归方式强制删除内容。
如果你写:
rm ./-rf
参数不再以破折号开头,所以它只是一个文件名。同样,按照通用(但不是通用)约定,-- 标记选项参数的结尾,之后的任何内容都不再是选项(通常意味着它是文件名)。所以:
rm -- -rf
删除文件,因为rm 知道-- 后面的参数是文件名,而不是它要处理的选项。
如果使用通配符,文件-rf 会更加危险:
rm *rf*
突然之间,这将删除目录和文件(但不会损害文件-rf)。
【讨论】:
rm *rf* 没有 达到我的预期。通配符作为选项!太可怕了!
不是一个完整的答案,因为我认为其他答案给出了很好的解释。
当我不确定给定的rm 调用将要删除什么时,我会尽量记住首先简单地ls 文件列表以确保它实际上是我想要删除的:
好吧,显然不对,让我们再试一次:
$ ls ./-rf ./-rf $这样更好。让我们用rm -v 替换ls 的历史记录(-v 只是为了额外的偏执/检查)并进行实际删除:
当您不确定扩展究竟是什么时,这也适用于通配符、大括号扩展等。
此外,如果您想知道如何首先创建像 -rf 这样的文件,如果您稍微弄乱了重定向,它会非常容易:
【讨论】: