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

Joe*_*Joe 118 unix linux rm

在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
Run Code Online (Sandbox Code Playgroud)

我应该从父文件夹使用什么Linux命令?

wmo*_*365 142

使用find for name"a"并执行rm以删除根据您的意愿命名的内容,如下所示:

find . -name a -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)

首先使用ls列出测试:

find . -name a -exec ls {} \;
Run Code Online (Sandbox Code Playgroud)

要确保这只删除目录而不删除普通文件,请使用"-type d"arg(如注释中所示):

find . -name a -type d -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)

"{}"是找到的每个文件"a"的替换 - exec命令是通过替换对每个文件执行的.

  • adj`echo {}`首先测试它,而不是`ls {}` (6认同)
  • 您可能希望在其中添加"-type d",只需添加匹配相同名称的文件即可. (4认同)
  • 另请注意,这将捕获类似于"1/2/a/3/4"的内容,这可能不是预期的,因此建议首先测试+1 ... (3认同)
  • “没有这样的文件或目录”错误来自 find,因为它尝试继续在您刚刚删除的同一文件夹中查找。使用 -prune 来防止这种情况发生并关闭它。 (3认同)
  • 这是我的`node_modules /`。 (2认同)
  • 我用`find。-name a -type d -exec rm -rf {} \;`可以工作,尽管它打印出`find:'./subdir/subdir/a':每个删除的目录都没有这样的文件或目录。 (2认同)

pis*_*che 133

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

find . -type d -name a -exec rmdir {} \;
Run Code Online (Sandbox Code Playgroud)

如果要递归删除其内容,请替换-exec rmdir {} \;-delete-prune -exec rm -rf {} \;.其他答案包括有关这些版本的详细信息.

  • 你能解释一下`{} \;`的作用吗? (8认同)
  • 可以将{{}读作“针对每个匹配的文件/文件夹”-即它替代了每个“找到的”文件/文件夹。“ \;”是--exec子句的终止符。 (4认同)
  • 当目录不为空时,这会给我一个“无法删除”错误 (4认同)
  • 考虑按照@David Grayson的建议在答案中添加“-prune”标志。如果没有这个,“find”仍将尝试访问现在丢失的文件夹,并最终退出并显示错误代码,这可能会导致 Docker 构建失败。 (3认同)

Ara*_*uhi 53

这也有效 - 它将删除所有名为"a"的文件夹及其内容:

rm -rf `find -type d -name a`
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一真正有效的. (7认同)
  • @ wmorrison365是的,目录被删除了,但我认为推荐一个命令失败的解决方案(返回非零退出代码)并不好. (6认同)
  • @ wmorrison365因为如果你做'找到.-name a -exec rm -rf {} \;`,当它试图进入该目录寻找更多项目时,find会崩溃,给你一个错误,比如`find:'1/2/3/a':没有这样的文件或目录`. (4认同)
  • 这给了我一个错误`illegal option --t`。我还必须通过目录进行搜索(/sf/ask/1808849941/):`rm -rf \`find 。-type d -name a\``。 (3认同)

Dav*_*son 22

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

find -type d -name foo -a -prune -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)

其他答案缺少一个重要的事情:-prune选项.如果没有-prune,GNU find将删除具有匹配名称的目录,然后尝试递归到它以查找更多匹配的目录.该-prune选项告诉它不要递归到与条件匹配的目录中.


1ns*_*nct 17

这个命令对我有用。它递归地完成它的工作

find . -name "node_modules" -type d -prune -exec rm -rf '{}' +
Run Code Online (Sandbox Code Playgroud)

. - 当前文件夹

“node_modules” - 文件夹名称


mpa*_*bo7 14

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

首先,我运行此操作以直观地验证要删除的文件夹:

find -type d -name node_modules -prune
Run Code Online (Sandbox Code Playgroud)

然后我运行它来删除所有:

find -type d -name node_modules -prune -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)

感谢开心果


小智 13

结合多个答案,这是一个适用于 Linux 和 MacOS 的命令

rm -rf $(find . -type d -name __pycache__)
Run Code Online (Sandbox Code Playgroud)


Sle*_*vin 11

find ./ -name "FOLDERNAME" | xargs rm -Rf
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.警告,如果您不小心将一台.或一台泵/送到xargs rm -Rf您的整台计算机,将被删除而无需将其取回,需要重新安装操作系统.

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

Tha*_*vam 9

我有超过100个文件

log-12
log-123
log-34
....
Run Code Online (Sandbox Code Playgroud)

以上答案对我不起作用

但以下命令帮助了我.

find . -name "log-*" -exec rm  -rf {} \;
Run Code Online (Sandbox Code Playgroud)

我给-type.,因此删除与启动文件和文件夹log-

rm -rf递归删除文件夹,即使它有文件.

如果你想单独的文件夹

find -type d -name "log-*" -exec rm  -rf {} \;
Run Code Online (Sandbox Code Playgroud)

单独的文件

find -type f -name "log-*" -exec rm  -rf {} \;
Run Code Online (Sandbox Code Playgroud)


小智 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)
Run Code Online (Sandbox Code Playgroud)

  • 此答案仅适用于空文件夹.`-delete`不会删除非空文件夹. (3认同)