即使未指定,Unix命令也会删除每个目录

时间:2012-05-10 23:35:45

标签: linux bash unix xargs rm

我是unix的新手。我运行了以下命令。

ls -l | xargs rm -rf bark.*

及以上命令删除了文件夹中的每个目录。

任何人都能解释我为什么吗?

3 个答案:

答案 0 :(得分:10)

-r参数表示“递归删除”(即下降到子目录中)。 -f命令表示“强制”(换句话说,不要求确认)。 -rf表示“递归下降到子目录而不要求确认”

ls -l列出目录中的所有文件。 xargsls -l获取输入并将其附加到您传递给xargs的命令

执行的最终命令如下所示:

rm -rf bark.* <output of ls -l>

这基本上删除了当前目录中的bark.* 所有文件。故事的道德:对rm -rf要非常小心。 (您可以在删除文件前使用rm -ri询问)

答案 1 :(得分:6)

rm(1)删除了当前工作目录中的每个文件和目录,因为您要求它。

要大致了解发生了什么,请运行:

cd /etc ;  ls -l | xargs echo

请注意输出。

我强烈建议在构造命令行时使用echo代替rm -rf。只有输出看起来很好,然后才能使用rm -rf重新运行命令。如有疑问,也许只需使用rm -r,这样就不会意外地吹走太多。 rm -ir如果您非常对您的命令行持怀疑态度。 (自1994年以来我一直在使用Linux,在构建稍微复杂的命令行以选择性地删除一堆文件时,仍然使用此echo技巧。)

顺便提一下,我会避免以任何方式解析ls(1)输出 - 文件名可以包含任何字符,但ASCII NUL/字符除外 - 包括换行符,<标签和输出看起来,如ls -l输出。尝试使用xargs(1)等工具解析可能会很危险。

相反,请使用find(1)来处理这些事情。要删除名为bark.*的所有目录中的所有文件,我将运行如下命令:

find . -type d -name 'bark.*' -print0 | xargs -0 rm -r

我再次使用echo代替rm -r进行第一次执行 - 如果它看起来不错,那么我将重新使用rm -r

答案 2 :(得分:5)

ls -l命令列出了当前当前工作目录(PWD)中的所有子目录。

如果您将rm命令作为列表传递给它,则rm test1.txt test2.txt myApp命令可以删除多个文件/目录。

例如:test1.txt test2.txt myApp 将删除名称为

的所有三个文件
rm

此外,您使用的rm -f命令的标志在许多愚蠢行为中很常见 rm -r - 强制删除文件而不询问或确认 /home/user |->dir1 |->dir2 `->file1.txt - 递归到所有子目录并删除其所有内容和子目录

所以,假设您在/ home / user中,目录结构如下:

ls -l

"dir1 dir2 file1.txt"命令将提供包含ls -l | xargs rm -rf的列表,命令rm -rf dir1 dir2 file1.txt的结果将如下所示:
rm -rf di1 dir2 file1.txt bark.*

如果我们使用上面的示例扩展您的原始问题,那么传递给系统的最终命令将变为: bark.*

因此,当前目录中的所有内容都被清除,因此bark.是多余的(你有效地告诉机器破坏当前目录中的所有内容)。

我认为您要做的是删除当前目录中的所有文件以及以find -iname bark.* | xargs rm开头的所有子目录(递归)为此,您只需执行以下操作:
find -iname bark.* | xargs echo

上面的命令意味着“查找此目录和子目录中的所有文件,忽略以字符”bark。“开头的大写/小写/ mIxEdCaSe,并删除它们”。如果您有拼写错误,这可能仍然是一个错误的命令,所以可以肯定的是,您应该在执行批量删除之前进行测试。

将来,请先执行以下操作,先获取要删除的所有文件的列表,以确认它们是您要删除的文件。
find -iname bark.* | xargs rm

如果您确定,请通过
删除它们 rm -rf /usr/local/.........

希望这有帮助。

作为一个幽默的说明,这里可以找到最着名的“rm -rf”实例之一: https://github.com/MrMEEE/bumblebee-Old-and-abbandoned/commit/a047be85247755cdbe0acce6f1dafc8beb84f2ac

自动脚本运行类似rm -rf /usr /local/......的内容,但由于意外插入空格,命令变为rm -rf "/usr/ local/....",因此这实际上意味着“删除所有以usr或local开头的根文件夹”,摧毁任何使用它的人的系统。我觉得这个开发人员不好。

您可以通过引用字符串来避免这些类型的错误,即: {{1}}会提供错误消息并避免此错误,因为引号意味着它们之间的所有内容都是完整路径,而不是单独路径/文件的列表(即:您告诉rm文件/文件夹有名称中的空格字符。)