如何删除特定名称的文件夹

253

在Linux中,如何删除嵌套在文件夹层次结构中的某个名称的文件夹?

以下路径位于一个文件夹下,我想删除所有名为a的文件夹。

1/2/3/a
1/2/3/b
10/20/30/a
10/20/30/b
100/200/300/a
100/200/300/b

我应该使用哪个Linux命令来自父文件夹操作?


或许有些偏题,但也许能帮到某些人:我有一个主文件夹里面有410个子文件夹,每个子文件夹都有两个子文件夹。所有第一个子文件夹的名称都是“final”,包含编辑过的PDF和一个Word内容列表。所有第二个子文件夹的名称都是“tif_pdf_various_names”,包含最初扫描保存为tiff文件(有些文件长达200页)、未编辑的PDF和一个草稿.docx内容列表,因此是一个家庭作业收集。我需要制作一个只包含最终编辑材料的410个文件夹的收藏品——其中tiff文件接近4TB。找到的最简单方法是使用(在Micr - Jurie
12个回答

269

如果目标路径为空,使用find命令,只过滤目录,根据名称进行过滤,执行rmdir命令:

find . -type d -name a -exec rmdir {} \;
如果您想要递归删除其内容,请将 -exec rmdir {} \; 替换为 -delete 或者 -prune -exec rm -rf {} \;。其他答案包括有关这些版本的详细信息,请给予他们应有的荣誉。

17
请问 {} \; 是什么意思? - winklerrr
16
{} 可以理解为“对于每个匹配的文件/文件夹”,即它代替了每个“找到”的文件/文件夹。\;-exec 子句的终止符。 - wmorrison365
8
当目录不为空时,这会给我一个“无法删除”的错误。 - blindeyes
5
根据@David Grayson的建议,考虑在答案中添加-prune标志。没有这个标志,find仍将尝试访问现在已经丢失的文件夹,并最终以错误代码退出,这可能会导致Docker构建失败。 - Czyzby

248

使用find命令查找名称为"a"的文件,并执行rm命令来删除符合您要求的文件,如下所示:

find . -name a -exec rm -rf {} \;

首先使用ls命令进行测试,列出文件列表:

find . -name a -exec ls {} \;
为了确保只删除目录而不是普通文件,请使用“-type d”参数(如评论中所建议的):
find . -name a -type d -exec rm -rf {} \;

"{}" 是替代每个找到的文件 "a" 的占位符 - exec 命令会通过替换执行每个文件。


5
你可能希望在那里添加一个“-type d”,以防止文件与相同名称匹配。 - Mark Loeser
3
还要注意,这将会匹配像 1/2/a/3/4 这样的内容,而这可能不是预期的结果,因此强烈建议先进行测试。 - twalberg
16
先使用 reco echo {} 进行测试,而不是 ls {} - Charney Kaye
18
这是我的 node_modules/ 文件夹。 - saruftw
15
我使用了命令find . -name a -type d -exec rm -rf {} \;,它可以正常工作,尽管对于每个被删除的目录它都会输出 find: ‘./subdir/subdir/a’: No such file or directory - pacoverflow
3
“没有那个文件或目录”错误是由find命令引起的,因为它试图在你刚刚删除的同一个文件夹中继续查找。使用-prune选项可以防止这种情况,并将其禁止输出。 - floydheld

113

这也可以使用-它将移除所有名为“a”的文件夹及其内容:

rm -rf `find . -type d -name a`

@Buffalo,怎么了?这肯定可以工作,但其他方法也是如此。如果在所有答案本质上都是“查找/删除”的情况下,发现这种方法可以工作而其他方法不行,那么我会感到惊讶。 - wmorrison365
9
由于如果您执行 find . -name a -exec rm -rf {} \;,当find尝试进入该目录查找更多项目时,find将崩溃,并显示类似于 find: '1/2/3/a': No such file or directory 的错误。请注意,此命令会递归地删除所有名为a的文件或目录。 - Alex Grönholm
@Alex Grönholm 当然,但是所有名为'a'的文件夹仍然会被删除。正如您所说,find无法在已删除的'a'文件夹内查找,但这并不重要。在删除之前保留'a'的内容以进行后续处理是与OP提出问题的不同用例。 - wmorrison365
10
是的,目录已被删除,但我认为不应该推荐一个命令失败并返回非零退出代码的解决方案。 - Alex Grönholm
4
我遇到了一个错误:“非法选项--t”。为了解决这个问题,我还需要指定要搜索的目录(参考https://dev59.com/kV8e5IYBdhLWcg3wVJTH)。命令如下:`rm -rf `find . -type d -name a``。 - Steve Harrison
我需要添加一个 . --> rm -rf \find . -type d -name a`` - I.G. Pascual

64

我在这里想要删除我的node_modules文件夹,在使用rsync备份我的工作进展之前。一个关键要求是node_modules文件夹可以嵌套,因此您需要使用-prune选项。

首先,我运行以下命令以直观地验证要删除的文件夹:

find . -type d -name node_modules -prune

然后我运行了以下命令来删除它们:

find . -type d -name node_modules -prune -exec rm -rf {} \;

感谢pistache


哦,这个很好用,如果你想让它更容易使用,你可以将其保存为一个小的shell脚本:#!/bin/bash echo “找到 node_modules 目录:”; find -type d -name node_modules -prune; read -r -p “您是否真的想删除所有目录? [yes/no]” input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi - Feirell
1
在我的Macbook Pro上,当我运行你的命令时,出现了“非法选项--t”的错误。所以我加了一个点。我的命令:find . -type d -name node_modules -prune -exec rm -rf {} \; - Christiaan Westerbeek
这就是为什么我正在切换到pnpm,它刚清理了我电脑上的150GB空间。谢谢这个建议。 - timhc22

37

要删除所有名称为foo的目录,请运行:

find -type d -name foo -a -prune -exec rm -rf {} \;
另外的答案缺少一个重要的东西: -prune选项。 如果没有-prune,GNU find将删除具有匹配名称的目录,然后尝试递归进入其中以查找更多符合条件的目录。 -prune选项告诉它不要递归进入满足条件的目录。

23

这个命令对我很有效。它能递归地完成工作。

find . -name "node_modules" -type d -prune -exec rm -rf '{}' +

- 当前文件夹

"node_modules" - 文件夹名称


1
正是我在寻找的东西 — 谢谢! - rpivovar

16
find ./ -name "FOLDERNAME" | xargs rm -Rf

这应该可以解决问题。警告:如果您不小心将 ./ 传递给 xargs rm -Rf,将会彻底删除整个计算机,而且无法恢复,需重新安装操作系统。


7
哦,只有那么微不足道的风险。这就是全部吗?哈哈,非常感谢警告。我肯定会犯那个打字错误的。 - TinkerTenorSoftwareGuy
我喜欢xargs的方法,因为它易于理解和易于模拟运行。你可以通过使用-print0-0(如这里所示)来解决“WARNING”问题。例如:find -type d -iname ".recycle" -print0 |xargs -0 -n1 rm -rf - undefined

15

结合多个答案,这里有一个可在Linux和MacOS上运行的命令。

rm -rf $(find . -type d -name __pycache__)

1
唯一对我有效且没有抛出错误的方法。 - Kloar

13

我有100多个像这样的文件:

log-12
log-123
log-34
....

以上的回答对我没有用,

但是以下的命令帮助了我。

find . -name "log-*" -exec rm  -rf {} \;

我将-type设置为.,因此它会删除以log-开头的所有文件和文件夹。

rm -rf递归删除文件夹,即使其中包含文件也会被删除。

如果仅想删除文件夹:

find -type d -name "log-*" -exec rm  -rf {} \;

仅限文件

find -type f -name "log-*" -exec rm  -rf {} \;

7

另一个例子:

"-exec rm -rf {} \;" can be replaced by "-delete"

find -type d -name __pycache__ -delete      # GNU find
find . -type d -name __pycache__ -delete    # POSIX find (e.g. Mac OS X)

5
这个回答仅适用于空文件夹。-delete命令无法删除非空文件夹。 - maninak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接