현재 디렉토리에서 특정 확장자의 모든 파일을 재귀 적으로 삭제하려면 어떻게해야합니까?


531

.bak하나의 명령 줄을 사용하여 현재 디렉토리 및 모든 하위 폴더에서 특정 확장자 (예 :)를 가진 모든 파일을 안전하게 삭제하려면 어떻게해야 합니까? 간단히 말해서 rm한 번 잘못 사용 했기 때문에 사용하기가 두려운 데 조언이 필요합니다.

답변:


840

당신 rm이 두려워한다면이 경우 에도 사용할 필요가 없습니다 . 사용 find:

find . -name "*.bak" -type f -delete

그러나 예방 조치와 함께 사용하십시오. 먼저 실행하십시오.

find . -name "*.bak" -type f

정확히 어떤 파일을 제거할지 확인하십시오.

또한 명령 의 마지막 인수 인지 확인하십시오-delete . 당신이 전에 넣어 경우 -name *.bak argument, 그것은 모두 삭제됩니다 .

참조 man findman rm추가 정보를 원하시면 또한 SE에이 관련 질문을 참조하십시오


이것은 어떻게 다른 rm *.bak가요?
sayantankhan

10
@ Bolt64 rm *.bak하위 디렉토리에서는 작동하지 않습니다.
Radu Rădeanu

기본 설정 rm *.bak을 사용 하면 현재 디렉토리에서 .bak로 끝나는 모든 파일 만 삭제됩니다. 또한 globs를 사용하여 바이올린을 연주하거나 -r 옵션을 사용하거나 find 예제를 사용하여 서브 디렉토리에서 작업을 수행하십시오.
Hennes

9
@Hennes 조심하세요 rm -r *.bak! 또한 .bak모든 내용으로 끝나는 디렉토리를 제거합니다 .
Radu Rădeanu

37
이것이 -delete명령의 마지막 인수 인지 확인하십시오 . -name *.bak인수 앞에 놓으면 모든 것이 삭제됩니다.
Michael

40
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f

1
askubuntu에 오신 것을 환영합니다! 이것이 완벽하게 유효한 대답이지만의 -delete플래그 대신 이것을 사용하면 이점이 없다고 생각 find합니다. find로 파일을 삭제하기위한 GNU 매뉴얼 항목 에서 더 많은 정보를 찾을 수 있습니다 .
Glutanimate

2
당신은 아마 맞을 것입니다, 그것은 아마도 대체 해결책 일 것입니다, 아마 더 날것입니다;)
lokers

11
이것은 대안 일뿐 아니라 다른 명령을 파이프 '|'와 결합하는 방법의 예입니다. +1
Boris Pavlović

13
이 대안 솔루션 (Cygwin에서와 같은) -delete 부족 다른 환경에서 작업
ciriarte

2
이것이 가장 좋은 대답이라고 생각합니다.
Léo Léopold Hertz 준영

33

먼저 명령을 실행하십시오 shopt -s globstar. 명령 행에서 실행할 수 있으며 해당 쉘 창에서만 적용됩니다. 에 넣을 수 있습니다. .bashrc그러면 새로 시작한 모든 쉘이이를 가져옵니다. 이 명령의 효과는 **/현재 디렉토리 및 해당 서브 디렉토리의 일치 파일을 재귀 적으로 작성하는 것입니다 (기본적으로 직접 서브 디렉토리의 **/경우와 동일한 의미 */). 그때:

rm **/*.bak

(또는 gvfs-trash **/*.bak당신이 무엇을).


21

파일을 삭제하는 것은 당신이 사용해야 rm하는 것이 아닙니다 . 대안은 다음과 같습니다.

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak                   # trash the files (thus moving them to the trash bin)

Flimm이 의견에 언급 한 바와 같이 :

패키지 trash-cligvfs-trashgvfs에 의존하지 않는 것과 같은 일을 합니다.

그래서:

sudo apt-get install trash-cli

trash-cli패키지는 trash우리가 원하는 것을 수행 하는 명령을 제공 하기 때문에 별명을 만들 필요가 없습니다 .

Eliah Kagan이 광범위한 의견을 명확하게 밝히면을 사용하여이 재귀를 만들 수도 있습니다 find. 이 경우 별칭을 사용할 수 없으므로 아래 명령은 설치 한 것으로 가정합니다 trash-cli. 나는 엘리아의 의견을 요약한다 :

이 명령은 .bak현재 디렉토리 나 하위 디렉토리 또는 아래의 모든 파일과 심볼릭 링크를 찾아 표시 합니다.

find . -name '*.bak' -xtype f

그것들을 삭제하려면 -exec다음 trash명령을 추가하십시오 :

find . -name '*.bak' -xtype f -exec trash {} +

-xtype f파일과 파일에 대한 심볼릭 링크를 선택하지만 폴더는 선택하지 않습니다. .bak 폴더도 삭제하려면 해당 부분을 제거하고을 사용 -execdir하면 디렉토리 내의 파일에 cannot trash non-existent오류가 발생 하지 않습니다 ..bak.bak

find . -name '*.bak' -execdir trash {} +

4
" rm물건을 삭제 하는 데 사용하지 마십시오 "는 논란의 여지가 있지만, 일을 취소 할 수있는 것을 사용하는 것이 현명하다는 데 동의해야합니다.
Oli

2
패키지 trash-cli는에 gvfs-trash대한 종속성이없는 것과 동일한 작업을 수행합니다 gvfs.
Flimm

나는 대답에서 그것을 편집했다. 다음에 자유롭게 편집 할 수있다.
don.joey

@ don.joey이 답변은 find . -name "*.bak" -type f무엇을 trash *.bak삭제 했는지 표시하는 것 같습니다 . 그게 진짜야? 당신과 함께 휴지통으로 디렉토리를 이동할 수 있습니다 trash또는 gvfs-trash, 그러나 trash *.bak의지는 파일과 이름이이로 끝나는 디렉토리로 이동 .bak하고이 현재 디렉토리에 바로 상주합니다. 셸이 확장 *.bak되므로 이름 trash *.bak이 아닌 .bak하위 디렉토리의 파일 에는 영향을 미치지 않습니다 .bak.
Eliah Kagan

1
@ don.joey 예 ls *.bak(당신이 생각하는 것)는 trash *.bak쓰레기를 나열합니다 . 아래의 find . -name '*.bak' -xtype f -exec trash {} +모든 .bak파일을 휴지통에 버립니다 .. 별명을 사용할 수 없으므로 대신 설치 trash-cli하거나 쓰십시오 gvfs-trash. 다음은 예입니다. -xtype f파일과 파일에 대한 심볼릭 링크를 선택하지만 폴더는 선택하지 않습니다. .bak 폴더 도 삭제하려면을 사용하여 디렉토리 내의 파일에 대한 오류를 find . -name '*.bak' -execdir trash {} +방지 cannot trash non existent합니다 . 귀하의 답변에 자유롭게 사용하십시오. .bak.bak
Eliah Kagan

5

특정 유형의 모든 파일을 삭제하지만 현재 폴더에서 하나의 폴더 "deep"만 삭제하려는 경우 :

find . -maxdepth 2 -name "*.log" -type f -delete

현재 디렉토리 " . "가 첫 번째 폴더로 계산 되므로 -maxdepth 2


1

빠른 답변 :

  • 이름이나 접미사가 고려 된 모든 파일을 재귀 적으로 삭제하십시오.

    find . -name '*.pyc' -type f -delete

  • 고려되는 이름을 가진 모든 디렉토리를 재귀 적으로 삭제하십시오.

    find ~ -path '*/__pycache__/*' -delete‍‍‍
    find ~ -type d -name '__pycache__' -empty -delete‍‍‍
    

    다소 엄격하게 제어되지는 않지만 한 줄로 표시됩니다.

    find ~ -path '*/__pycache__*' -delete
    

[ 참고 ] :

d디렉토리 옵션이며 f파일 옵션입니다.


0

git repo 안에 있다면 다음을 사용할 수 있습니다.

git clean -fdx

.gitignore에서 추적되지 않은 파일과 파일을 삭제합니다.

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