私が今やっていることは:
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行のコードを使用してこれを行う効率的な方法はありますか?
答え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)