现在我的做法是:
查找包含a.txt的目录
find -type f -iname "a.txt" | sed -r 's|/[^/]+$||' > a_paths.txt
查找包含b.txt的目录
find -type f -iname b.txt | sed -r 's|/[^/]+$||' > b_paths.txt
打印差异
comm -23 <(sort a_paths.txt ) <(sort b_paths.txt)
有没有一些有效的方法可以使用find
单行代码?
答案1
如果您find
支持-execdir
并且-printf
:
find . -name a.txt -execdir [ ! -e b.txt ] \; -printf %h\\n
将查找名为 的文件a.txt
,检查它们是否有同级b.txt
文件,如果没有,则输出包含目录的名称。
没有-execdir
或-printf
:
find . -name a.txt -exec sh -c '
for file do
dir=${file%/*}
[ -e "$dir/b.txt" ] || printf "%s\n" "$dir"
done' sh {} +
它还更高效,因为它不会为每个文件运行一个命令。
答案2
和zsh
:
printf '%s\n' **/*(D/e'{[[ -e $REPLY/a.txt && ! -e $REPLY/b.txt ]]}')
或者:
printf '%s\n' **/a.txt(D^e'{[[ -e $REPLY:h/b.txt ]]}':h)