我需要删除target
所有子文件夹中的一个文件夹。
答案1
如果您知道这样的目录不会超过几千个target
,您可以使用以下命令设置globstar
和dotglob
shell 选项bash
shopt -s globstar dotglob
然后使用
rm -rf ./**/target/
target
这将删除当前目录中或当前目录下调用的任何目录。末尾的斜杠至关重要,因为否则模式可能会匹配非目录的内容。
该**
模式通过设置 shell 选项来启用globstar
,并“递归地”向下匹配到子目录。由于dotglob
也设置了,这也会找到target
隐藏子目录下调用的目录(就像find
会做的那样)。
在 macOS 上,默认 bash
太旧,无法支持globstar
shell 选项,因此您可能需要安装最新的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 {} +
应该对你有用。
抱歉大家,发布了不满意的答案。您的反馈信息非常丰富。
原答案:
find . -type d | grep -E '/target$' | xargs rm -r
应该管用。find . -type d | grep -E '/target$'
在删除文件夹之前检查是否给出了预期的输出!最好是保存而不是后悔。