あるファイルが含まれ、別のファイルが含まれていないディレクトリへのパスを見つける方法は?

あるファイルが含まれ、別のファイルが含まれていないディレクトリへのパスを見つける方法は?

私が今やっていることは:

  • 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)
    

find1行のコードを使用してこれを行う効率的な方法はありますか?

答え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)

関連情報