查找不包含特定子目录的目录名称

查找不包含特定子目录的目录名称

我有几个这样的目录:

Rep1/foo/bar/files

Rep2/foo/otter/files

Rep3/foo/bar/files

...

我想要的是没有子目录 */bar/ 的目录的名称,并可能删除它们。我怎样才能做到这一点 ?

答案1

您可以使用以下脚本find

for topdir in ./*/; do
    [ -z "$(find "$topdir" -type d -name bar -print -quit)" ] &&
    echo "$topdir"
done

该部分只是在找到子目录-print -quit后退出的优化。bar/如果您的版本find不支持,-quit您可以删除该部分。该命令仍然有效,但可能会慢一点。

或者这个纯bash脚本

shopt -s globstar
for topdir in ./*/; do
    (cd "$topdir" && compgen -G '**/bar/' > /dev/null) ||
    echo "$topdir"
done

如果您对结果满意,请替换echo "$topdir"rm -r "$topdir"删除目录。

两种方法都可以处理任意文件/目录名称,即使是带有换行符或特殊符号的文件/目录名称*

答案2

使用 bash 命令行查找路径中**/files不存在的所有子目录:/bar/

find . -type d -name files | grep --invert-match /bar/

它会给你一个输出:

./Rep2/foo/otter/files

现在,如果您只想列出顶级目录,请使用:

find . -type d -name files | grep --invert-match /bar/ | cut --delimiter / --fields 2

它为您提供:

Rep2

答案3

尝试这个,

find . -mindepth 3 -maxdepth 3 ! -iname bar -type d | awk -F'/' '{print $2}'

Rep2

答案4

zsh

has_bar() () (($#)) ${1-$REPLY}/*/bar(N/)

echo rm -rf rep*(/^+has_bar)

或者在单个命令中:

echo rm -rf rep*(/^e'[() (($#)) $REPLY/*/bar(N/)]')

echo(高兴时删除)

相关内容