5

我对unix很陌生。我运行了以下命令。

ls -l | xargs rm -rf bark.*

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

谁能解释我为什么?

4

3 回答 3

10

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

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

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

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

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

于 2012-05-10T23:41:41.360 回答
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 -lxargs(1)

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

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

同样,我会在第一次执行时使用echo代替rm -r- 如果它看起来不错,那么我会重新运行rm -r.

于 2012-05-10T23:42:55.487 回答
5

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

rm如果您将它们作为列表传递给它,该命令可以删除多个文件/目录。

例如:rm test1.txt test2.txt myApp将删除所有三个具有以下名称的文件:

test1.txt
test2.txt
myApp

此外,您使用的命令的标志rm在许多愚蠢行为中很常见。
rm -f- 在不询问或确认的情况下强制删除文件
rm -r- 递归到所有子目录并删除其所有内容和子目录

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

 /home/user
|->dir1
|->dir2
`->file1.txt

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

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

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

然后,如果您确定,请通过以下方式删除它们
find -iname bark.* | xargs rm

希望这可以帮助。

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

自动脚本运行类似rm -rf /usr/local/.........,但由于意外插入空格,命令变为rm -rf /usr /local/......,因此这实际上意味着“删除所有以 usr 或 local 开头的根文件夹”,有效地破坏了使用它的任何人的系统。我为那个开发者感到难过。

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

于 2012-05-10T23:56:12.160 回答