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


139

在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个文件夹-410个文件夹中的每个文件夹都有两个子文件夹。所有第一个子文件夹都命名为“最终”,并包含编辑的pdf和Word内容列表。所有第二个名为tif_pdf_various_names的子文件夹都包含最初扫描的已保存到tiff文件(大约200页),未编辑的pdf和.docx内容列表草稿-因此是家庭作业集。我需要收集仅包含最终编辑材料的410个文件夹的集合-纸箱接近4TB。找到的最简单方法是使用(在Micr
Jurie

Answers:


155

如果目标目录为空,请使用find,仅过滤目录,按名称过滤,执行rmdir:

find . -type d -name a -exec rmdir {} \;

如果你想递归地删除它的内容,更换-exec rmdir {} \;-delete-prune -exec rm -rf {} \;。其他答案包括有关这些版本的详细信息,也请相信它们。


9
您能解释一下{} \;吗?
winklerrr

6
{}可以读作“针对每个匹配的文件/文件夹”-即它替代了每个“找到的”文件/文件夹。\;是该-exec子句的终止符。
wmorrison365

2
当目录不为空时,这给我一个“无法删除”的错误
瞎眼

1
考虑-prune根据@David Grayson的建议在答案中添加标志。没有这个,find仍然会尝试访问现在丢失的文件夹,并最终以错误代码退出,这可能例如使Docker构建失败。
Czyzby

160

将find用作名称“ a”,然后执行rm删除根据您的意愿命名的名称,如下所示:

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

首先使用ls进行测试以列出:

find . -name a -exec ls {} \;

为了确保只删除目录而不删除普通文件,请使用“ -type d” arg(如注释中所建议):

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

“ {}”是找到的每个文件“ a”的替换-通过替换针对每个文件执行exec命令。


4
您可能想在其中添加“ -type d”,以防文件匹配相同名称。
Mark Loeser 2012年

3
另请注意,这将捕获类似的内容1/2/a/3/4,这可能不是故意的,因此建议+1首先测试...
twalberg 2012年

9
reco首先对其echo {}进行测试,而不是ls {}
Charney Kaye

2
我的node_modules/
saruftw

6
我曾经使用过find . -name a -type d -exec rm -rf {} \;并且可以正常工作,尽管它find: ‘./subdir/subdir/a’: No such file or directory为每个删除的目录打印了出来。
pacoverflow

59

这也起作用-它将删除所有名为“ a”的文件夹及其内容:

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

@布法罗,怎么来?这种软件有效,其他软件也一样。找到一个可行的环境会很惊讶,但是其他人并没有给出所有答案find/rm
wmorrison365 '16

4
@ wmorrison365,因为如果这样做find . -name a -exec rm -rf {} \;,当尝试进入该目录以查找更多项目时,find将崩溃,从而给您类似的错误find: '1/2/3/a': No such file or directory
AlexGrönholm'17年

@AlexGrönholm当然可以,但是所有名为“ a”的文件夹仍被删除。如您所说,find无法随后在已删除的'a'文件夹中查找,但这并不重要。想要保留'a'的内容以便在删除之前进行后续处理是与OP要求不同的用例。
wmorrison365

6
@ wmorrison365是的,目录已删除,但是我不建议您在命令失败的情况下(返回非零退出代码)推荐解决方案。
AlexGrönholm'17年

1
这给了我一个错误illegal option --t。我只好也通过目录(搜索stackoverflow.com/questions/25840713/...rm -rf `find . -type d -name a`
史蒂夫·哈里森

25

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

find -type d -name foo -a -prune -exec rm -rf {} \;

其他答案缺少重要事项:-prune选项。如果不使用-prune,GNU find将删除具有匹配名称的目录,然后尝试递归进入该目录以查找更多匹配的目录。该-prune选项告诉它不要递归到符合条件的目录中。


21

我最终在这里寻找要删除的node_modules文件夹,然后再使用备份正在进行的工作rsync。一个关键要求是node_modules文件夹可以嵌套,因此您需要此-prune选项。

首先,我运行此命令以可视方式验证要删除的文件夹:

find -type d -name node_modules -prune

然后我运行此命令将其全部删除:

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

多亏了开心果


嗯,效果很好,您可以轻松地使用它,也可以将其保存为小sh #!/bin/bash echo "Found node_modules: "; find -type d -name node_modules -prune; read -r -p "Do you really want to delete all directories? [yes/no] " input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi
脚本

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

应该做到的。警告,如果您不小心抽了./xargs rm -Rf您的整个计算机中,则将被删除,并且没有将其恢复的选项,需要重新安装OS。


2
哦,那小小的风险。这就是全部?哈哈。超级感谢您的警告。我肯定会犯那种打字错误。
TinkerTenorSoftwareGuy

9

我有超过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 {} \;

8

结合多个答案,这是在Linux和MacOS上均可使用的命令

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

唯一一个为我工作的那didnt也抛出错误
Kloar

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)

3
此答案仅适用于空文件夹。-delete不会删除非空文件夹。
maninak

感谢您添加OSX版本
schu34 '19

6

该命令对我有用。它以递归方式进行工作

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

。-当前文件夹

“ node_modules”-文件夹名称


-2

查找/文件夹/文件夹的路径-maxdepth 1-名称“ my_ *” -type d-删除

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.