如果您知道这样的目录不会超过几千个,您可以使用target
以下命令设置globstar
和dotglob
shell 选项bash
shopt -s globstar dotglob
Run Code Online (Sandbox Code Playgroud)
然后使用
rm -rf ./**/target/
Run Code Online (Sandbox Code Playgroud)
这将删除target
当前目录中或当前目录下调用的任何目录。末尾的斜杠至关重要,因为否则模式可能会匹配非目录的内容。
该**
模式通过设置 shell 选项来启用globstar
,并“递归地”向下匹配到子目录。由于dotglob
也设置了,这也会找到target
隐藏子目录下调用的目录(就像find
会做的那样)。
在 macOS 上,默认值 bash
太旧,无法支持shell 选项,因此您可能需要使用Homebrewglobstar
安装最新版本,或切换到(当前是新 macOS 用户帐户的默认 shell)。bash
zsh
使用zsh
,您可以使用以下命令执行此操作
rm -rf ./**/target(/D)
Run Code Online (Sandbox Code Playgroud)
其中(/D)
表示“仅匹配目录并包括隐藏目录”。glob**
在 中默认启用zsh
。
和find
:
find . -depth -type d -name target -exec rm -rf {} +
Run Code Online (Sandbox Code Playgroud)
这将找到target
位于当前目录中或当前目录下的所有目录,然后rm -rf
一次调用尽可能多的目录来删除它们。该-depth
选项进行find
深度优先搜索(我们希望这样做可以避免尝试搜索我们刚刚删除的目录)。
如果您使用sh
shell(没有**
),或者您有数千个这样的目录,则这将是您将使用的命令。
即使您有大量target
目录,您仍然应该能够将它们一一删除
for dirpath in ./**/target/; do
rm -rf "$dirpath"
done
Run Code Online (Sandbox Code Playgroud)
尽管这会比使用慢,因为您为每个目录find
调用一次。rm