删除所有子文件夹中的“target”文件夹

删除所有子文件夹中的“target”文件夹

我需要删除target所有子文件夹中的一个文件夹。

答案1

如果您知道这样的目录不会超过几千个target,您可以使用以下命令设置globstardotglobshell 选项bash

shopt -s globstar dotglob

然后使用

rm -rf ./**/target/

target这将删除当前目录中或当前目录下调用的任何目录。末尾的斜杠至关重要,因为否则模式可能会匹配非目录的内容。

**模式通过设置 shell 选项来启用globstar,并“递归地”向下匹配到子目录。由于dotglob也设置了,这也会找到target隐藏子目录下调用的目录(就像find会做的那样)。

在 macOS 上,默认 bash太旧,无法支持globstarshell 选项,因此您可能需要安装最新的bash使用自制,或切换到zsh(当前是新 macOS 用户帐户的默认 shell)。

使用zsh,您可以使用以下命令执行此操作

rm -rf ./**/target(/D)

其中(/D)表示“仅匹配目录并包括隐藏目录”。 glob**在 中默认启用zsh


find

find . -depth -type d -name target -exec rm -rf {} +

这将找到target位于当前目录中或当前目录下的所有目录,然后rm -rf一次调用尽可能多的目录来删除它们。该-depth选项进行find深度优先搜索(我们希望这样做可以避免尝试搜索我们刚刚删除的目录)。

sh如果您使用shell(没有**),或者您有数千个这样的目录,则这将是您将使用的命令。

即使您有大量目录target,您仍然应该能够将它们一一删除

for dirpath in ./**/target/; do
    rm -rf "$dirpath"
done

尽管这会比使用慢,因为您为每个目录find调用一次。rm

答案2

编辑:

根据对此问题的评论,最好充分利用该find命令的广泛功能并完全跳过管道(还告诉find不要进入它将要求rm删除的目录):

find . -type d -name target -prune -exec rm -r {} +

应该对你有用。

抱歉大家,发布了不满意的答案。您的反馈信息非常丰富。


原答案:

稍微谷歌一下列出所有子目录管道到 rm

find . -type d | grep -E '/target$' | xargs rm -r

应该管用。find . -type d | grep -E '/target$'在删除文件夹之前检查是否给出了预期的输出!最好是保存而不是后悔。

相关内容