bash에서 디렉토리를 삭제하지 않고 디렉토리의 모든 파일과 하위 디렉토리를 제거하는 방법은 무엇입니까?


53

디렉토리를 삭제하지 않고 디렉토리의 모든 파일과 하위 디렉토리를 제거하는 명령이 있습니까?

예를 들어 하위 디렉토리가 "1", "2", "3"인 "dontDeleteMe"디렉토리가 있고 각 하위 디렉토리에 사진이 몇 개있는 경우 하위 디렉토리 "1", "2"및 "3"을 제거하는 방법 부모 디렉토리 "dontDeleteMe"를 제거하지 않고 그 안에있는 모든 파일?

답변:


66

모든 것을 제거하려면 에서 디렉토리를 제거하지 않고 디렉토리를 입력 :

rm -rfv dontDeleteMe/*

/*부분은 매우 중요합니다. 앞에 공백을 넣으면 *현재 디렉토리의 모든 파일이 삭제됩니다.

또한, 매우 노는 조심 rm, -r*같은 명령의 모든. 그들은 비참한 조합이 될 수 있습니다.

업데이트 : 좋아, 숨겨진 점 파일 (처음에 점이있는 파일 이름, 예 .hidden)이 있으면 파일이 그대로 유지됩니다.

따라서 원래 질문에 대한 가장 간단한 해결책 은 다음과 같습니다. rm -rfv dontDeleteMe && mkdir dontDeleteMe

또 다른 방법은 find-exec옵션이나 파이프를 사용하는 것입니다 xargs(아래).

find dontDeleteMe/* -print0 | xargs -0 rm -rv


xargs를 사용하는 예를 들어 줄 수 있습니까? xargs 란 무엇입니까?
justingrif

@ justingrif : find dontDeleteMe/* -print0 | xargs -0 rm -rv 나는 대부분의 경우 공간에 관계없이 작동하지 않을 것이라고 생각합니다. 그러나 cd로 가서 /tmp/테스트 디렉토리를 만들고 시도하십시오. :)
Matt

아, 그리고 맨 페이지 : "xargs-표준 입력에서 명령 행 빌드 및 실행"
Matt

5
디렉토리를 다시 만드는 것은 내용을 삭제하는 것과 같지 않습니다. 예 : umask 디렉토리 권한 차이, 소유자 차이 등 ... enzotib의 답변 은 원래 구문의 문제를 해결할 것입니다

3
이것은 좋은 대답이 아닙니다. *를 사용하는 것은 위험하며 "dotglob"가없는 도트 파일에서는 작동하지 않습니다 (아래 참조). rm -rf dontDeleteMe && mkdir dontDeleteMe디렉토리가 동일한 권한 / 소유자로 다시 작성되도록 보장하지 않습니다. 대신 find dontDeleteMe/ -mindepth 1 -delete아래 변형 중 하나를 사용하십시오 .
Nils Toedtmann

27

rm -r ./*항상 작동하지 않는 유일한 이유 는에 일치하지 않는 숨겨진 파일 및 / 또는 폴더를 가질 수 있기 때문 *입니다.

이를 bash위해 *숨겨진 개체까지 모든 항목을 일치 시키는 옵션을 제공하십시오 .

cd dont-delete-me
shopt -s dotglob
rm -r ./*

dotglob위 명령을 실행 한 쉘을 계속 사용하는 경우 기본 (설정되지 않은) 상태 로 재설정 하는 것이 유용 할 수 있습니다 .

shopt -u dotglob 

당신은 많은 수의 파일이있을 때 그것은 또한 작동하지 않을 수 있습니다
S를 ...

23

열린 터미널 ( Ctrl+ Alt+ T) 개미 유형은 다음과 같습니다.

find somedir -mindepth 1 -delete

이것은 모든 파일과 디렉토리 내에서 일치 somedir하고 (손자) 어린이 "숨겨진"점 파일을 포함하지만 제외 somedir있기 때문에 그 자체를 -mindepth 1한 후, -delete그들을.


AskUbuntu에 오신 것을 환영합니다! 귀하의 답변은 원래의 포스터에 도움이 될 수 있지만, 귀하의 답변이 불완전하게 만드는 데 도움이 될 수있는 정보가 부족합니다.
Oyibo

3
설명이 부족하지만 여전히 가장 좋은 대답입니다. OSX에서도 작동합니다 (물론 터미널을 여는 방법은 제외).
noamtm

6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

xdev장치 경계 내에서만 파일을 삭제 하려면 옵션을 사용하십시오 .


GNU find에는이 -delete있습니다. 그것은 의미 -depth와보다 더 기억하기 쉽다-depth -exec rm -Rf {} \;
닐스 Toedtmann

4

"dontdelete"라는 기본 디렉토리를 제외한 모든 파일과 하위 디렉토리를 삭제하려면 (터미널에서) :

rm -rf dontdelete/*

숨겨진 파일은 삭제되지 않으므로 "모든 파일"이 너무 굵게 표시 될 수 있습니다.
Stefan van den Akker

4

플래그 find와 함께 사용할 수 있습니다 -delete.

find dontDeleteMe/* -delete

/*이 이야기로 중요하다 find"dontDeleteMe"라는 폴더 안에 만 검색 할 수 있습니다.

또한 -delete플래그가 find명령 의 끝에 있는지 확인 하십시오 .


1
이 솔루션은을 활성화하지 않으면 숨겨진 파일을 삭제하지 않습니다 dotglob. 그렇지 않으면 -mindepth 1flag 옵션을 사용하는 것이 작동하는 유일한 방법 인 것 같습니다.
Stefan van den Akker

3
rm -rf  directory/{.*,/*}

뭐라고 :

로 시작하는 모든 파일을 제거하십시오. "디렉토리"및 다른 모든 파일에도.

Neftas가 친절하게 언급했지만 이 솔루션 은 안전하지 않습니다!

보다 안전한 솔루션은 다음과 같습니다.

 rm -rf directory/!(.|..)

당신은 또한 포함하고 있기 때문에이 명령은 잠재적으로 위험 할 수 ...디렉토리. 로 변경 {.*}하면 이 문제를 피할 수 있지만와 {.??*}같이 한 문자 만있는 숨겨진 파일은 삭제하지 않습니다 .a.
Stefan van den Akker

이것에 대해 무엇입니까? rm -rf directory /! (. | ..)
Tebe

그것은 내가 생각해 낸 것보다 훨씬 나은 해결책처럼 보입니다. 답을 편집 해 보시기 바랍니다.
Stefan van den Akker

제안 수락)
Tebe

1

왜 이것이 그렇게 복잡한 지 잘 모르겠습니다. 틀린 경우 도와주세요.

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

그게 다야


이것은 현재 디렉토리를 삭제하려고 시도하는 데 약간의 결함이 있습니다. 물론 호출 디렉토리의 작업 디렉토리로 여전히 사용 중이기 때문에 작동하지 않습니다.
David Foerster

1

더 간단한 답변이 있습니다.

  1. cd dontDeleteMe

  2. rm -rf *

기본 시스템 관리 강의 시간 : 이와 같은 스위핑 명령을 사용할 때 현재 위치에주의를 기울이십시오.

나는 충분히 말할 수 없습니다. 누군가가주의를 기울이지 않고 rm -rf */에 있는 동안 입력했기 때문에 상자를 복구해야했습니다 .

* nix는 귀하가 루트이거나 루트로 sudoing하는 경우 자신이하는 일을 알고 있다고 가정합니다. 그러기 전에하고있는 일을 알아야합니다.

'rm'을 발행하기 전에 'cd'명령이 작동하는지 확인하는 대안은

cd dontDeleteMe && rm -rf *

6
이것은 위험한 제안입니다. 당신이 원하는 것은 : cd dontDeleteMe && rm -rf *
Izkata

@Izkata 또는 rm 명령을 실행하기 전에 cd 작업이 성공적인지 확인하십시오.
Eliah Kagan

1
@EliahKagan 이것이 바로 내 코드 스 니펫의 기능입니다.
Izkata

실제로 그것은 당신이 제안한 것보다 더 또는 덜 위험하지 않습니다. 모든 &&는 두 명령을 동시에 연결하여 동시에 실행되도록하는 것입니다. rm -rf *를 실행하기 전에 중지하고 .look해야하기 때문에 내 방법이 실제로 안전하다면. 이중 확인을 일시 중지하는 것이 항상 좋습니다.
user30619

5
@ user30619 &&운영자는 명령을 함께 연결하지 않습니다. 다음 명령이 실행되기 전에 각 명령이 성공해야합니다. 은 IF cd명령 (디렉토리가 존재하지 않는, 권한 등) 어떤 이유로 실패 후 rm명령이 실행되지 않습니다. 나는 그것을 더 안전하게 부를 것입니다.
ean5533

0
  1. 나를 위해 가장 쉬운 것-Windows 전문가이지만 우분투 초보자
  2. 실행기에서 파일 아이콘을 클릭하십시오.
  3. 삭제하려는 파일 및 폴더가있는 디렉토리로 이동하십시오.
  4. 파일 옆에있는 창의 빈 영역을 마우스 오른쪽 버튼으로 클릭하고 "터미널에서 열기"를 클릭하십시오.
  5. 터미널 창이 열리고 찾은 폴더로 "설정"됩니다
  6. "dir"(내가 type이라고 말할 때 따옴표 무시)을 입력하고 터미널에서 Enter 키를 누르면 파일과 폴더 목록이 표시됩니다.
  7. "rm -rf *"를 입력하고 Enter를 누르십시오
  8. 시스템을 삭제할 폴더 / 파일의 크기에 따라 일시 중지됩니다
  9. 터미널 프롬프트가 돌아 오면 열린 파일 창에 "폴더가 비어 있습니다"라고 표시됩니다.
  10. 이 방법으로 성공했으며 파일 창과 터미널 창에서 Dir 명령의 결과로 파일 / 폴더를 볼 수있어 편안했습니다.
  11. 또한 파일 창에 폴더가 비어있는 것으로 표시되었습니다. 특히 파일이있는 휴지통 폴더를 찾기 위해이 파일을 쫓아 왔기 때문에 위로가되었습니다.
  12. 답변을 제출 한 모든 사람에게 감사합니다. 매우 유익했습니다.

rm -rf *어쨌든 달리기 때문에 특히 복잡해 보입니다 .
David Foerster

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