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
在删除文件之前询问)
rm(1)
删除当前工作目录中的每个文件和目录,因为您要求它.
要大致了解发生了什么,请运行:
cd /etc ; ls -l | xargs echo
Run Code Online (Sandbox Code Playgroud)
注意输出.
我强烈建议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
Run Code Online (Sandbox Code Playgroud)
我再次使用echo
它代替rm -r
第一次执行 - 如果它看起来很好,那么我会重新运行rm -r
.
该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字符).