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

arp*_*oid 5 unix linux bash rm xargs

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

ls -l | xargs rm -rf bark.*
Run Code Online (Sandbox Code Playgroud)

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

谁能解释我为什么?

dwu*_*urf 10

-r参数意味着"递归删除"(即下降到子目录).该-f命令意味着"强制"(换句话说,不要求确认).-rf表示"递归下降到子目录而不要求确认"

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

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

rm -rf bark.* <output of ls -l>
Run Code Online (Sandbox Code Playgroud)

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


sar*_*old 6

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

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

cd /etc ;  ls -l | xargs echo
Run Code Online (Sandbox Code Playgroud)

注意输出.

我强烈建议echorm -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
Run Code Online (Sandbox Code Playgroud)

我再次使用echo它代替rm -r第一次执行 - 如果它看起来很好,那么我会重新运行rm -r.


Clo*_*oud 5

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

rm如果将这些文件/目录作为列表传递给它,该命令可以删除它们.

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

test1.txt
test2.txt
myApp
Run Code Online (Sandbox Code Playgroud)

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

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

 /home/user
|->dir1
|->dir2
`->file1.txt
Run Code Online (Sandbox Code Playgroud)

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.To do" 开头的子目录(recurse),你只需要这样做:
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文件/文件夹的名称中有一个SPACE字符).