我有几个这样的目录:
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
(高兴时删除)