지정된 확장자를 가진 파일을 제외한 디렉토리의 모든 파일을 어떻게 나열합니까? 제외한 모든 파일을

.txt , .pdf 및 기타 파일이 들어있는 폴더가 있다고 가정 하십시오. “기타”파일 (예 : 확장자가 .txt 또는 .pdf가 없는 파일)을 나열하고 싶습니다 . 이 작업을 수행하는 방법에 대한 조언이 있습니까?

주어진 확장자가없는 파일을 나열하는 방법을 알고 있습니다. 예를 들어 .txt 파일을 제외한 모든 파일을 나열하려면

find -not -iname "*.txt"

또는

ls | grep -v '\.txt$' | column

작동하는 것 같습니다. 그러나 .txt 파일 또는 .pdf 파일을 제외한 모든 것을 어떻게 나열 할 수 있습니까? 내가 몇 가지 논리적 인 종류의 “또는”을 사용할 필요가 보인다 findgrep.



답변

하나의 적절한 버전이 있다고 가정하면 ls가장 간단한 방법 일 수 있습니다.

ls -I "*.txt" -I "*.pdf"

모든 서브 디렉토리를 반복하려면 다음을 수행하십시오.

ls -I "*.txt" -I "*.pdf" -R


답변

지원 찾기 -o

find . ! '(' -name '*.txt' -o -name '*.pdf' ')'

우선권을 가지려면 괄호가 필요합니다. 찾기는 많은 일을한다. 맨 페이지를 읽는 것이 좋습니다.

또는을 수행 할 수도 있습니다 grep(그러나 실제로 는의 출력을 구문 분석해서는 안됩니다ls )

ls | grep -Ev '\.(txt|pdf)$' | column


답변

bash(으로 켜 글 로빙 확장 shopt -s extglob)의 글로브는 !(*.txt|*.pdf)작동합니다. 이 glob을 포함하여 (이에 국한되지는 않음) 파일 인수를 취하는 모든 명령에 직접 전달할 수 있습니다 ls.


답변

에서 zshextendedglob:

print -rl -- *~*.(txt|pdf)

또는

print -rl -- ^*.(txt|pdf)

또는 kshglob(예, ksh globbing은 “bash extended globbing”이 아닙니다) :

print -rl -- !(*.txt|*.pdf)

도트 파일도 제외한다는 점을 기억하십시오.

ksh93에는 FIGNORE(mis) 기능이 있습니다.

FIGNORE='@(.|..|*.txt|*.pdf)'
printf '%s\n' *


답변

find /path/to/directory '!' -name '*.pdf' '!' -name '*.txt'

이것은 De Morgan의 법칙 때문에 OR 연산자를 사용한 명령과 동일합니다 .


답변

derobert가 제안한 것처럼 가장 좋은 방법은을 사용하는 것 find입니다. 그러나 실제로 다른 명령과 함께 파이프 라인에서 결과를 사용할 수 있습니다 .

GNU (및 일부 BSD) 는 NUL 문자로 끝나는 파일 이름을 인쇄하도록 지시 find하는 -print0술어를 지원합니다 .이 문자는 파일 이름에 허용되지 않는 문자이며 충돌이 발생하지 않습니다. 다른 명령은 NUL 을 입력 분리 자로 사용하도록 지시 할 수 있습니다 .

그중 가장 중요한 것은 GNU xargs이며, 이것은 지정한 명령을 실행하고 파일 목록을 명령 행 인수로 전달합니다. xargs -r0find와 함께 실행하려고합니다 -print0. 예를 들면 다음과 같습니다.

find . -type f ! \( -name \*.pdf -o -name \*.txt \) -print0 | xargs -r0 ls -ld

이름에 공백이나 인쇄 할 수없는 문자가있는 파일을 포함하여 모든 pdftxt 파일 의 긴 디렉토리 목록을 안전하게 인쇄합니다 .

tar다음과 같이 GNU와 함께 사용할 수도 있습니다 .

tar -zcf myarchive.tar.gz --null --files-from <(
  find . -type f ! -name \*.tar.gz -print0)

이름이 .tar.gz로 끝나지 않는 모든 파일의 tar.gz 파일을 빌드합니다.

rsync또한 -0다른 여러 가지 와 마찬가지로 매개 변수를 사용하여 null로 구분 된 파일을 허용 합니다. 그러나 xargs일반적으로 이러한 유형의 용도로 사용할 접착제입니다. 또는 find-exec기능 중 하나입니다 .


답변

서브 디렉토리가없는 경우

ls !(*.pdf|*.txt)

작동해야합니다!

그러나

ls -I "*.pdf" -I "*.txt"

일반적인 방법입니다.