在一个目录下,我有一堆名为
Debug
的目录。我该如何删除所有的Debug
目录?不太清楚---在目录dir_a
下,你只能有一个名为Debug
的目录。还是说你有dir_a/Debug
,dir_a/dir_b/Debug
,dir_a/dir_c/Debug
等等?
你可以使用以下命令列出目录dir_a
下所有名为确切Debug
的目录:
cd dir_a # or whatever you need to go there
find . -type d -name Debug
Debug
的目录。要删除它们(请再次确认,这是不可撤销的):find . -depth -type d -name Debug -exec rm -r {} \;
-depth
会在 Debug/Debug/
之前列出 Debug/
,以避免错误。
详细解释:
find . -type d -name Debug
将搜索当前目录(.
)下的所有目录项,其既是目录 (-type d
) 且名称为 "Debug" (-name Debug
)。
添加的 -depth
标志使搜索按深度优先的方式进行(这意味着较深层次的匹配将在较浅层次的匹配之前找到)。
-exec ... \;
告诉 find
对于每个匹配项执行 ...
中的命令。(分号需要用引号引起来,因为否则 shell 会对其进行解释)。
在上述命令 ...
中,特殊符号 {}
会被替换为当前的匹配项。
所以通俗地说,它的意思是:找到此目录下的每个名为 "Debug" 的子目录,按深度优先的方式,对于每个匹配项执行命令 rm -r
,后面跟着目录的完整名称。
-delete
选项,是否就不需要使用-depth
了? - terdon-delete
隐含了-depth
),但它会抗议目录不为空... 这就是使用rm -r
的原因。 - Rmanofind
手册中找到对{}
和\;
的描述,而不是在rm
手册中。我添加了一些详细信息。 - Rmano