예를 들어 *.txt라는 이름의 파일이 포함된 모든 디렉터리를 찾고 싶습니다. 그러나 출력에는 중복이 포함되어서는 안 됩니다. 어떻게 하나요?
답변1
노력하다:
find . -type f -name "*.txt" -printf '%h\n' | sort | uniq
작동 방식은 다음과 같습니다.
find . -type f -name "*.txt" -printf '%h\n'
- ( )로 끝나는 모든 파일을 찾아 *.txt
해당 디렉토리( %h
)와 개행 문자를 인쇄합니다.
| sort
- 디렉토리 정렬
| uniq
- 중복 제거
답변2
POSIX 호환적용해야 할 코드어느파일 이름:
find . -name '*.txt' -printf '%h\0' | tr '\0\n' '\n\0' | sort -u | tr '\0\n' '\n\0'
답변3
문제는 디렉토리 이름에 개행 문자가 포함될 수 있으므로 find의 출력이 NUL로 끝나야 한다는 것입니다. 정렬된 결과에 대해 읽을 수 있는 출력 파이프라인을 가지려면 다음을 수행하십시오 tr
.
find . -name "*.txt" -printf '%h\0' | sort -zu | tr '\0' '\n'
디렉터리 이름의 줄 바꿈은 ./
디렉터리의 줄 바꿈으로 시작하지 않는 경우 다음 줄을 확인하여 확인할 수 있습니다.
답변4
find
GNU 와 bash 사용
find . -type d -exec bash -c \
$'for f; do find \"$f\" -maxdepth 1 -type f -name \'*.txt\' -printf \'%h\\n\' -quit; done'\
_ {} +