리눅스에서 * .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.txtaatxta-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.