.txt , .pdf 및 기타 파일이 들어있는 폴더가 있다고 가정 하십시오. “기타”파일 (예 : 확장자가 .txt 또는 .pdf가 없는 파일)을 나열하고 싶습니다 . 이 작업을 수행하는 방법에 대한 조언이 있습니까?
주어진 확장자가없는 파일을 나열하는 방법을 알고 있습니다. 예를 들어 .txt 파일을 제외한 모든 파일을 나열하려면
find -not -iname "*.txt"
또는
ls | grep -v '\.txt$' | column
작동하는 것 같습니다. 그러나 .txt 파일 또는 .pdf 파일을 제외한 모든 것을 어떻게 나열 할 수 있습니까? 내가 몇 가지 논리적 인 종류의 “또는”을 사용할 필요가 보인다 find
나 grep
.
답변
하나의 적절한 버전이 있다고 가정하면 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
.
답변
에서 zsh
와 extendedglob
:
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 -r0
find와 함께 실행하려고합니다 -print0
. 예를 들면 다음과 같습니다.
find . -type f ! \( -name \*.pdf -o -name \*.txt \) -print0 | xargs -r0 ls -ld
이름에 공백이나 인쇄 할 수없는 문자가있는 파일을 포함하여 모든 pdf 및 txt 파일 의 긴 디렉토리 목록을 안전하게 인쇄합니다 .
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"
일반적인 방법입니다.