Linux Unix命令删除了每个目录,即使未指定
我对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 .
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)
输出——文件名可以包含ASCIINUL
和/
字符以外的任何字符——包括换行符、制表符和类似于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可能就是这样一个残废的白痴。