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

kio*_*o21 1 bash directory rm macos

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

Kus*_*nda 8

如果您知道这样的目录不会超过几千个,您可以使用target以下命令设置globstardotglobshell 选项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)。bashzsh

使用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深度优先搜索(我们希望这样做可以避免尝试搜索我们刚刚删除的目录)。

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

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

for dirpath in ./**/target/; do
    rm -rf "$dirpath"
done
Run Code Online (Sandbox Code Playgroud)

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