디렉토리 내에서 모든 하위 디렉토리를 제거하려면 어떻게합니까?


51

이 질문은 제가 여기에 게시 한 첫 번째 질문에 대한 2 단계입니다.

하위 디렉토리, .zip 파일 및 하위 디렉토리에 포함되지 않은 다른 임의 파일이 들어있는 디렉토리가 있습니다.

부모 디렉토리에서 모든 하위 디렉토리를 제거하는 명령 줄 스크립트를 원하지만 하위 디렉토리에 속하지 않는 모든 zip 파일과 느슨한 파일을 유지하십시오. 모든 하위 디렉토리에는 내용이 있으므로 -f 명령으로 강제로 삭제해야한다고 생각합니다.

따라서 기본적으로 부모 디렉토리 (또는 현재 디렉토리)를 들여다 보는 명령은 그 안의 모든 폴더를 삭제하지만 폴더가 아니거나 폴더에 포함 된 다른 모든 내용과 파일은 유지합니다.

명령 줄에서 항목을 삭제하면 특별한주의가 필요하지만 이미 원격 백업을 위해 필요한 모든 예방 조치를 취했습니다.

답변:


61

BASH에서는 슬래시를 사용할 수 있습니다 ( POSIX 셸에서 작동해야 한다고 생각 합니다).

rm -R -- */

--옵션은 인수와 옵션을 분리하고 하이픈으로 시작하는 항목을 제거 할 수 있습니다. 그렇지 않으면 셸로 확장 한 후 항목 이름이 옵션으로 해석됩니다 rm(다른 명령 줄 유틸리티의 경우와 동일).

-f쓸 수없는 파일을 삭제할 때 확인 메시지를 표시하지 않으려면 옵션을 추가하십시오 .

기본적으로 숨겨진 디렉토리 (이름이로 시작하는 디렉토리 .)는 그대로 유지됩니다.

중요한 경고 : 확장 */에는 결국 디렉토리 유형의 파일로 해석되는 심볼릭 링크도 포함됩니다 . 그리고 rm구현 에 따라 rm -R -- thelink/심볼릭 링크를 삭제하거나 링크 된 디렉토리 의 내용 을 재귀 적으로 삭제 하지만 디렉토리 자체 또는 심볼릭 링크는 삭제 하지 않습니다.

사용하는 경우 zsh, 더 좋은 방법은 사용하는 것입니다 글로브 규정을 형 디렉토리 만의 파일을 선택합니다 :

rm -R -- *(/) # or *(D/) to include hidden ones

또는:

rm -R -- *(-/)

디렉토리에 대한 심볼릭 링크 포함 (그러나 이번에는 확장에 후행이 없으므로 /모든 rm구현에서 제거되는 심볼릭 링크 만 해당 ).

bash, AT & T ksh, yash또는 zsh당신은 할 수 있습니다 :

set -- */
rm -R -- "${@%/}"

후행을 제거합니다 /.


아름다운! 이것은 완벽하게 작동합니다. 나는 그것이 그렇게 쉬운 것을 몰랐다. -r과 -R에 대해 자세히 설명하고 해당 명령의 기능에 대해 설명 하시겠습니까? 많은 감사합니다.
Evster

-r, -R, --recursive"재귀 적 디렉토리와 그 내용을 제거"를 의미하는 동의어입니다.
peterph

무엇을 설명 할 수 있습니까?
양서류

6
또한 rm -R ./*/하이픈 이름과 관련된 문제를 피할 수 있습니다.
l0b0

1
*와 /의 순서를 바꾸지 않도록주의하십시오. rm -R-/ *는 당신이 일어나고 싶지 않은 완전히 다른 것을 수행합니다 : |
ChrisOdney

13

와일드 카드 방식 외에도 find(최소한 GNU find)를 사용하여 다음을 수행 할 수 있습니다 .

find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 rm -R

다른 find줄 과 마찬가지로 첫 번째 부분 ( find -mindepth 1 -maxdepth 1 -type d)을 실행하여 제거 될 디렉토리 목록을 볼 수 있습니다.

더 안전한 옵션은 다음과 같이하는 것입니다.

find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 mv -i -t ../to-rm
# or
mv -i -t ../to-rm */
# or
mv -i */ ../to-rm

그중 하나라도 ../to-rm삭제하지 않고 모든 내용을 이동시킵니다 . 당신은 당신이 원하는대로, rm -Rf당신의 여가에 그 디렉토리를 했는지 확인할 수 있습니다 .


은 "CLI-쓰레기통"에 대한 +1 to-rm하고 find있는 멋지게 (다른 성가신 이스케이프 외에) 점으로 시작하는 디렉토리를 처리합니다. :)
peterph

팁 고마워. 삭제하기 전에 별도의 디렉토리로 이동한다는 아이디어가 마음에 듭니다. Mac OS X에서 터미널을 통해 작업하고 있는데 -mindepth 및 -maxdepth 명령을 사용하려면 일종의 GNU 패키지를 설치해야한다고 생각합니까?
Evster

@Evster는 Mac OS X find가 지원하는지 확실하지 않습니다. 나는 여전히 핑크 (여전히 주변에 있습니까?)가 그 발견을 설치할 수 있다고 생각합니다. 또는 생략하고 grep을 사용하여 생성 된 파일 목록을 필터링 할 수 있습니다. rm 대신 mv 옵션을 사용하십시오.
derobert

4

이러한 제안 중 일부에 대한 스크립트를 작성 rm -R -- */하여 / usr / local / bin 폴더에 보관할 수 있습니다. 또는 alias~ / .bashrc 파일에서을 만드 십시오. 명령을 잘못 입력하고 시스템을 중단하기 가 매우 쉽습니다 (단일 문자 및 / 또는 문자 순서조차도 치명적인 결과를 초래할 수 있음). 이것은 다른 옵션과 인수를 입력하는 것보다 다소 강력한 해결책으로 작용할 것입니다 이 작업을 수행 할 때마다

또한 의도하지 않은 삭제를 피하기 위해 다른 도구로 사용되는 스크립트 또는 명령에 -i or --interactive=once또는 -I or --interactive=always옵션 을 포함 할 수 있습니다 .

또한 derobert 와 같은 것이 가장 좋습니다. 스크립트를 파일 / 터미널 편집기에 복사 / 붙여 넣기 만하면 특정 요구에 맞게 조정할 수 있으며 파일 / 디렉토리는 단일 디렉토리 (확인 / 확인할 수있는 내용)로 이동하여 간단히 제거 할 수 있습니다. rm -rf명령을 실행합니다 .

다른 옵션은 파일 관리자와 같은 GUI 응용 프로그램을 사용하고 삭제하려는 모든 해당 파일 / 폴더를 선택하는 것입니다. 권한이 없으면 배포 매뉴얼 페이지를 확인하십시오.

마지막으로 폴더가 비어 있으면 (기본적으로 간단한 파일 이름) rmdir명령을 사용하여 폴더 를 삭제할 수 있습니다. 삭제하려는 모든 항목에는 작동하지 않지만 "집안 청소"를 원할 때 유용합니다. **이 -p --ignore-fail-on-non-empty옵션을 사용하면 특정 하위 디렉토리와 빈 "부모"(있는 디렉토리)를 삭제할 수 있습니다.


이 명령을 호출 할 수있는 별도의 스크립트를 작성하는 것이 좋습니다. -i 및 -I 옵션이 정확히 무엇을 설명 할 수 있습니까? 감사!
Evster

- "Enter"를 누른 후이 옵션을 제거 할 것임을 확인하는 메시지가 표시됩니다 (3 개 이상의 파일 / 폴더가 "선택"된 경우). 반면에 -i 옵션은 각 파일에 대해 프롬프트를 표시합니다. "y"와 "Enter"를 누르면 간단히 확인할 수 있습니다. 긍정적 인 응답 외에는 제거 프로세스 중에 해당 파일을 건너 뜁니다.
ILMostro_7

1

먼저 일반 파일 ls -d * /를 방해하지 않으면 서 디렉토리를 나열한 다음 제거해야합니다. ls -d * /는 하위 디렉토리 만 나열하고 rm로 파이프하면 디렉토리와 내용이 제거되어 느슨한 파일은 그대로 유지됩니다.

이 명령은 작업을 수행해야합니다.

ls -d  */ | xargs rm -rf

1
어떤 이점이 rm -rf -- */있습니까? arg가 너무 큰 오류 를 해결하는 printf '%s\0' */ | xargs -r0 rm -rf --데 도움이되지만 ( printf내장 되어있는 쉘에서는 ) 도움 이 되지만 추가 문제를 제외하고는 AFAICT를 추가하지 않습니다. lsls -d */ | xargs rm -rf
Stéphane Chazelas

1
@AnthonyGeoghegan, 예를 들어 " .."(space ..) 라는 디렉토리가있는 경우 일부 ls구현으로 부모 디렉토리의 내용을 제거합니다 . 그리고 그것은 공백 일뿐 만 아니라 다른 빈 문자, 줄 바꿈, 작은 따옴표, 큰 따옴표, 백 슬래시 및 파일 이름으로 시작합니다 -.
Stéphane Chazelas

2
@Ankit, 당신은 시작할 수 mywiki.wooledge.org/ParsingLs
스테판 Chazelas가에게

1
옵션 printf으로 처리 할 수 ​​있도록 각 이름이 null 문자로 끝나는 목록을 생성하는 데 사용하는 @ StéphaneChazelas의 제안을 완전히 이해 xargs하면 -0옵션 으로 처리 할 있도록 답변을 편집 하여 변형으로 업데이트하는 것이 좋습니다. 코드 스 니펫을 이해하고 잠재적으로 존재할 수있는 특정 파일 이름으로 인한 바람직하지 않은 동작을 방지하는 방법을 배우면 기꺼이 자신을 기쁘게 생각합니다.
Anthony G-Monica에 대한 정의

1
를 사용 xargs하면 허용되는 답변에 비해 한 가지 이점이 있습니다 (현재 디렉토리에 많은 파일 / 디렉토리가있는 경우 작동 함).이를 유용한 답변으로 편집 할 수있는 범위가 있습니다. 개인적으로 Stack Exchange 질문에 답하는 것은 좋은 학습 경험 이되는 것으로 나타났습니다. 특히 다른 사용자로부터 유용한 피드백을받을 때 특히 그렇습니다.
Anthony G-Monica에 대한 정의

-1

rm -rf <directory name>. 효과가있다. 입력 rm <directory name>만하면 각 하위 디렉토리를 수동으로 제거해야하는 여러 하위 질문이 발생합니다. 그러나 rm -rf하위 디렉토리와 함께 전체 디렉토리를 한 번에 제거하는 데 도움이됩니다.


5
OP는 현재 디렉토리의 내용을 유지하도록 요청했습니다.
Stephen Rauch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.