rm -rf /base-dir-path/*/work 与 /base-dir-path/*/*/work 不同

rm -rf /base-dir-path/*/work isn't the same as /base-dir-path/*/*/work

如果我想从 linux/unix 中的给定根目录中删除具有给定名称的所有子目录,您会认为您可以发出如下命令:

rm -rf /base-dir-path/*/work 

但是,上面的命令在搜索任何名为 'work' 的子目录时只会深入 1 个目录。为了实现我想要的,我最终用一个额外的'*/'重复相同的命令,直到 rm returns 'rm: No match.', EG:

rm -rf /base-dir-path/*/*/*/work

有没有办法让 rm 之类的命令在其通配符搜索中匹配 /,这样我只需要发出一个通配符 * 字符?

在 tcsh 6.18.00 或更高版本上:

set globstar
rm -rf /base-path/path/**/work

在 bash 4.0 或更高版本上:

shopt -s globstar
rm -rf /base-dir/path/**/work

在 ksh 上:

set -o globstar # or set -G
rm -rf /base-dir/path/**/work

在 zsh 上:

rm -rf /base-dir/path/**/work

或者,find 符合 POSIX 的 2006 年修订版:

find /base-dir/path -type d -name work -exec rm -rf -- '{}' +

如果您没有 find-exec ... {} +,那么您可能也没有 xargs -0,并且需要以低效的方式来确保安全:

find /base-dir/path -type d -name work -exec rm -rf -- '{}' ';'