如何删除所有具有特定名称的目录?

在一个目录下,我有一堆名为Debug的目录。我该如何删除所有的Debug目录?
1个回答

不太清楚---在目录dir_a下,你只能有一个名为Debug的目录。还是说你有dir_a/Debugdir_a/dir_b/Debugdir_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/,以避免错误。

详细解释:

  1. find . -type d -name Debug 将搜索当前目录(.)下的所有目录项,其既是目录 (-type d) 且名称为 "Debug" (-name Debug)。

  2. 添加的 -depth 标志使搜索按深度优先的方式进行(这意味着较深层次的匹配将在较浅层次的匹配之前找到)。

  3. -exec ... \; 告诉 find 对于每个匹配项执行 ... 中的命令。(分号需要用引号引起来,因为否则 shell 会对其进行解释)。

  4. 在上述命令 ... 中,特殊符号 {} 会被替换为当前的匹配项。

所以通俗地说,它的意思是:找到此目录下的每个名为 "Debug" 的子目录,按深度优先的方式,对于每个匹配项执行命令 rm -r,后面跟着目录的完整名称。


如果您使用GNU find的-delete选项,是否就不需要使用-depth了? - terdon
1@terdon 考虑过这个问题(手册上说 -delete 隐含了 -depth),但它会抗议目录不为空... 这就是使用 rm -r 的原因。 - Rmano
在"rm -r {} ;"命令中,"{} ;"选项代表什么意思?我尝试谷歌搜索rm linux命令,但没有找到关于该选项的示例。我应该在其他命令的示例中寻找吗? - sontra
@sontra,你可以在find手册中找到对{}\;的描述,而不是在rm手册中。我添加了一些详细信息。 - Rmano