답변:
당신은 사용할 수 있습니다 find
:
find . -type f ! -name '*.txt' -delete
또는 bash의 확장 된 글러브 기능 :
shopt -s extglob
rm *.!(txt)
또는 zsh에서 :
setopt extendedglob
rm *~*.txt(.)
# || ^^^ Only plain files
# ||^^^^^ files ending in ".txt"
# | \Except
# \Everything
*.!(txt)
될 !(*.txt)
?
rm
괜찮고 폴더가 있으면 질식합니다.
find . -type f ! -name "*.txt" | xargs -r rm
는 GNU \ xargs에서 작동 하는지 확인하십시오 . BSD 및 UNIX xargs 명령에 -r이 없을 수도 있습니다 –r 로컬을 확인해야합니다man xargs
거꾸로 grep과 xargs를 사용할 수 있습니다
ls | grep -v .txt$| xargs rm
ls | grep -v *.txt | xargs rm
마찬가지로 작동
grep -v *.txt
는 정확히 하나의 .txt
파일 이있는 경우에만 작동 합니다. 없는 경우 패턴으로 grep
사용 *.txt
합니다. 하나 이상이 있으면의 모든 .txt
출력을 무시하고 다른 모든 파일에서 첫 번째 파일 이름을 검색합니다 ls
. (정확한 결과는 쉘의 glob 옵션에 따라 달라질 수 있습니다.)
.txt$
txt
점에 관계없이 끝나는 문자열과 일치 합니다. 때문에이 grep
매개 변수로 정규 표현식을합니다. 따라서 파일 a.txt
과 aatxt
및 a-txt
은 모두이 표현식과 일치합니다. 올바른 표현은이어야합니다 ls | grep -v \\.txt$ | xargs --no-run-if-empty rm
. 호기심이 많은 사람들을 위해 : 식을 가지고 놀고 싶다면이 테스트 식을 안전하게 사용하십시오 ls | grep \\.txt$ | xargs --no-run-if-empty echo
(참고 : -v
및 플래그 없음 rm=>echo
). 참고 2 : 이중 백 슬래시가 나타날 수 있습니다. 하나는 정규식이고 다른 하나는 bash가 슬래시를 피하는 것입니다.
간단히 :
rm $(ls -I "*.txt" )
# * .txt를 제외한 파일 형식을 삭제합니다.
마찬가지로 "하나 이상의 파일 형식 제외"를 삭제해야하는 경우 다음을 수행하십시오.
rm $(ls -I "*.txt" -I "*.pdf" )
# * .txt 및 * .pdf를 제외한 파일 형식을 삭제합니다.
-I
옵션은 유용 할 수 있지만 ls를 구문 분석하지 않는 이유를 참조하십시오 . 그리고 무엇을 | xargs
달성합니까? 인수가 없으면 모든 echo
입력에서 실행 됩니다.
xargs
달성해야 할 것은 무엇입니까 ?
ls
실제로 호출하기 전에 무해한 명령으로 주어진 답변을 테스트하십시오rm
.