리눅스에서 * .txt 패턴을 제외한 모든 파일을 삭제하는 방법은 무엇입니까?


73

에 txt의해 현재 디렉토리 아래의 모든 파일 을 삭제하는 방법을 알고 rm *.txt있습니다. 누구든지 현재 디렉토리 EXCEPT txt파일의 모든 파일을 삭제하는 방법을 알고 있습니까?


20
항상 그렇듯이 ls실제로 호출하기 전에 무해한 명령으로 주어진 답변을 테스트하십시오 rm.
— chepner 2016 년

답변:


111

당신은 사용할 수 있습니다 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

이 중 일부는 폴더가 있는지 여부 및 폴더로 수행하려는 작업에 따라 조정해야 할 수도 있습니다.
— 케빈

1
안 *.!(txt)될 !(*.txt)?
— Lri

@LauriRanta는 폴더에 무엇이 있는지에 따라 다르지만 답을 얻지 못했습니다. 모든 파일에 확장자가 있으면 rm괜찮고 폴더가 있으면 질식합니다.
— 케빈

괄호에 문제가 있습니다. bash 스크립트에서 globbing 스타일을 사용하면 구문 오류와 괄호에 대해 불평합니다. 그러나 CLI에서 수행하면 작동합니다.
— CMCDragonkai

1
@izogfif find . -type f ! -name "*.txt" | xargs -r rm는 GNU \ xargs에서 작동 하는지 확인하십시오 . BSD 및 UNIX xargs 명령에 -r이 없을 수도 있습니다 –r 로컬을 확인해야합니다man xargs
— Ntwobike

10

'* .txt'를 제외한 모든 파일 을 삭제하려는 경우 다음 명령을 사용할 수 있습니다.

$ find . -type f ! -name "*.txt" -exec rm -rf {} \;

그러나 파일과 함께 디렉토리 를 삭제하려면 다음을 사용할 수 있습니다.

$ find . ! -name "*.txt" -exec rm -r {} \;


9

할 수있는 방법은 여러 가지가 있습니다. 그러나 가장 간단한 방법은 (bash)입니다.

shopt -s extglob
rm !(*.txt)

4

하나없는 솔루션 find:

mv dir/*.txt otherdir/
rm -r dir
mv otherdir dir

이것은 모든 종류의 껍질에서 작동합니다.


3

거꾸로 grep과 xargs를 사용할 수 있습니다

ls | grep -v .txt$| xargs rm

ls | grep -v *.txt | xargs rm마찬가지로 작동
— phillipsk

@phillipsk grep -v *.txt는 정확히 하나의 .txt파일 이있는 경우에만 작동 합니다. 없는 경우 패턴으로 grep사용 *.txt합니다. 하나 이상이 있으면의 모든 .txt출력을 무시하고 다른 모든 파일에서 첫 번째 파일 이름을 검색합니다 ls. (정확한 결과는 쉘의 glob 옵션에 따라 달라질 수 있습니다.)
— JigglyNaga

.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가 슬래시를 피하는 것입니다.
— Dimitry K

1

간단히 :

rm $(ls -I "*.txt" ) # * .txt를 제외한 파일 형식을 삭제합니다.

마찬가지로 "하나 이상의 파일 형식 제외"를 삭제해야하는 경우 다음을 수행하십시오.

rm $(ls -I "*.txt" -I "*.pdf" ) # * .txt 및 * .pdf를 제외한 파일 형식을 삭제합니다.


StackExchange에 오신 것을 환영합니다! 이 -I옵션은 유용 할 수 있지만 ls를 구문 분석하지 않는 이유를 참조하십시오 . 그리고 무엇을 | xargs달성합니까? 인수가 없으면 모든 echo입력에서 실행 됩니다.
— JigglyNaga

xargs달성해야 할 것은 무엇입니까 ?
— dhag

고마워, xargs는 위의 경우 유용하지 않았으며 지금 수정했습니다.
— Surya

0

또한 명시된 파일 ( )을 제외한 모든 숨겨진 (도트) 파일 및 폴더 를 제거합니다 .mydir.

rm -rf $(ls -aI ".mydir")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.