한 파일은 포함하고 다른 파일은 포함하지 않는 디렉토리의 경로를 찾는 방법은 무엇입니까?

한 파일은 포함하고 다른 파일은 포함하지 않는 디렉토리의 경로를 찾는 방법은 무엇입니까?

내가 지금 하는 일은:

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

관련 정보