![한 파일은 포함하고 다른 파일은 포함하지 않는 디렉토리의 경로를 찾는 방법은 무엇입니까?](https://linux55.com/image/10953/%ED%95%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%80%20%ED%8F%AC%ED%95%A8%ED%95%98%EA%B3%A0%20%EB%8B%A4%EB%A5%B8%20%ED%8C%8C%EC%9D%BC%EC%9D%80%20%ED%8F%AC%ED%95%A8%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%9D%98%20%EA%B2%BD%EB%A1%9C%EB%A5%BC%20%EC%B0%BE%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
내가 지금 하는 일은:
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)