Linux Unix命令删除了每个目录,即使未指定

Linux Unix命令删除了每个目录,即使未指定,linux,bash,unix,xargs,rm,Linux,Bash,Unix,Xargs,Rm,我对unix非常陌生。我运行了以下命令 ls -l | xargs rm -rf bark.* 上面的命令删除了文件夹中的每个目录 谁能解释一下原因吗 参数-r表示“递归删除”(即下降到子目录)。-f命令表示“强制”(换句话说,不要求确认)-rf表示“在不要求确认的情况下递归地下降到子目录” ls-l列出目录中的所有文件xargs从ls-l获取输入,并将其附加到传递给xargs 最后执行的命令如下所示: rm -rf bark.* <output of ls -l> find .

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

ls -l | xargs rm -rf bark.*
上面的命令删除了文件夹中的每个目录


谁能解释一下原因吗

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

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

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

rm -rf bark.* <output of ls -l>
find . -type d -name 'bark.*' -print0 | xargs -0 rm -r
rm-rf树皮。*
这实际上删除了当前目录中的所有文件。这个故事的寓意是:要非常小心使用
rm-rf
。(您可以使用
rm-ri
在删除文件之前询问)

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.*
的所有目录中的所有文件,我将运行如下命令:

rm -rf bark.* <output of ls -l>
find . -type d -name 'bark.*' -print0 | xargs -0 rm -r

再一次,我将使用
echo
代替
rm-r
执行第一次执行——如果看起来不错,那么我将使用
rm-r
重新运行
ls-l
命令给出当前工作目录(PWD)中所有子目录的列表

如果您将多个文件/目录作为列表传递给rm,则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开头的所有子目录(递归)。
要做到这一点,您只需执行以下操作:
find-iname树皮。*| xargs rm

上面的命令意味着“查找此目录和子目录中以“bark.”开头的所有文件,忽略大写/小写/混合大写,并将其删除”。如果您有输入错误,这仍然可能是一个错误的命令,因此可以肯定的是,在执行这样的批量删除之前,您应该始终进行测试

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

如果确定,请通过
find-iname树皮。*| xargs rm

希望这有帮助

幽默地说,“rm-rf”最著名的例子之一可以在这里找到:

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

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

有时我发现自己在没有
find-print0
和成对的
xargs-0
的系统上。非常非常讨厌。我认为Solaris可能就是这样一个残废的白痴。