명령 행에서 디렉토리의 빈 디렉토리를 모두 삭제하려면 어떻게합니까?


58

라는 디렉토리가 있다고 가정 해보십시오 foo/. 이 폴더에는 하위 디렉토리가 있습니다. 하나의 명령으로 빈 디렉토리를 모두 삭제하려면 어떻게해야합니까?

답변:


119

이 명령을 시도하십시오 :

find . -empty -type d -delete

find명령은 지정된 경로 (이 경우 현재 디렉토리)에서 특정 검색 기준과 일치하는 파일 / 디렉토리를 검색하는 데 사용됩니다 ..

-empty옵션은 비어있는 모든 파일 및 디렉토리에 적용됩니다.

-type d옵션은 지정된 파일 형식에 적용됩니다. 이 경우 d파일 유형 디렉토리를 나타냅니다 .

-delete옵션은 수행 할 조치이며 검색에서 찾은 모든 파일에 적용됩니다.


나는 이것이 가장 쉬운 방법이라고 생각합니다. 그래서 나는 이것을 대답으로 표시 할 것입니다.
justingrif

빌 이봐, 나는 또 다른 비슷한 질문을 게시하려고했는데 그것이 속담이라고 말했기 때문에 나에게 보내지 않을 것이기 때문에 여기에 대답 할 수 있기를 바랐다. 위와 동일한 작업을 원했지만 비어 있는지 여부에 관계없이 모든 디렉토리를 제거하십시오.
justingrif

3
비어 있는지 여부에 관계없이 디렉토리를 제거하는 방법에 다음 명령을 입력하십시오 rm -rf <directory-name>.. 파일과 하위 디렉토리를 포함한 모든 내용과 함께 디렉토리가 제거됩니다. 이 -r옵션은 재귀 적으로 삭제하는 -f것을 의미 하고 명령은 삭제하기 전에 프롬프트를 표시하지 않습니다. 그러나 디렉토리 / 파일을 삭제하기 전에 프롬프트를 표시하려면 -f옵션을 옵션으로 바꾸십시오 -i.
Bill

해당 디렉토리에 일부 파일이 있으면 유지하고 싶습니다. 따라서 / foo / bar /의 모든 디렉토리를 삭제하고 거기에있을 수있는 모든 파일을 유지하려고했습니다.
justingrif

2
그것은 공급하는 파이프를 사용하여이 작업을 수행 할 수 있습니다 stdout하나의 명령 (예의를 find로) stdin(예 : 다른 rm이 / 당신이 원하지 않는 디렉토리를 쓸어 또는 파일을 삭제할 수 있기 때문에), 그러나 매우 조심 지우다! 이 작업을 수행하는 방법에 대한 자세한 내용 man은 이러한 각 명령에 대한 페이지를 참조하십시오 . 안전을 위해 실제 작업을 시도하기 전에 항상 임시 디렉토리에서 이러한 항목을 테스트하십시오.
Bill

11

rmdir비어 있지 않은 디렉토리를 삭제 하는 명령의 거부와 find -depth디렉토리 트리를 순회하는 옵션을 활용할 수 있습니다 .

find . -depth -exec rmdir {} \;  

오류를 무시하거나 추가 2>/dev/null하여 실제로 무시합니다.

디렉토리 트리의 맨 아래에서 찾기 시작 하는 -depth옵션 find입니다.

rm -rf디렉토리의 모든 파일 (및 해당 서브 디렉토리 및 ....)과 모든 디렉토리 및 모든 파일 을 삭제합니다 .


8
rmdir *

빈 디렉토리를 모두 삭제합니다. 비어 있지 않은 모든 디렉토리와 파일에 대해 오류가 발생하여 오류가 터미널을 어지럽히 지 않도록하십시오.

rmdir * 2> /dev/null

이것은 0이 아닌 상태 코드로 종료되므로 작동하기 때문에 스크립팅에는 적합하지 않습니다.
the_drow

@the_drow 어떻게 부적합합니까? 그건 그렇고 당신은 또한 사용할 수 있습니다 rmdir * 2>/dev/null || true. ( find (1) 방법은 스크립팅에 더 좋지만 다른 이유로 : 원하는 것을 더 잘 표현하기 때문입니다.)
Alois Mahdal

나는 종종 이것을한다 $HOME. 사악한 미소로.
Alois Mahdal

일부 디렉토리가 비어 있지 않으면 실패를보고하기 때문입니다.
the_drow

찾기 방법보다 빠릅니까? 누구 둘을 비교 했습니까?
Xerus

1
find . -type d -empty -delete -maxdepth 1

의 직접 하위 디렉토리 만 삭제하려는 경우 foo/.


0

파이썬 접근

$ tree                                                                                                                                                                                  
.
├── empty_dir1
├── empty_dir2
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

4 directories, 4 files
$ python -c 'import os;empty=[r for r,s,f in os.walk(".") if not f and not s and r != "." ];map(lambda x: os.rmdir(x),empty)'
$ tree
.
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

이것은 다음과 같이 작동합니다.

  • os.walk()디렉토리 트리를 재귀 적으로 걷는 함수를 사용 합니다. 각 반복이에 r우리가 액세스하는 현재 폴더로 설정되어, s내 디렉토리 목록을 포함 r하고 f해당 폴더의 파일 목록이 포함됩니다. 물론 경우 fs비어있는, 우리가 알고 r비어 있습니다.
  • 첫 번째 목록 이해를 통해 empty위에서 언급 한 평가에 따라 비어있는 모든 디렉토리 목록 을 작성할 수 있습니다 .
  • 두 번째 기능 은 목록의 각 항목 map()을 수행 os.rmdir()하는 데 사용됩니다 empty. 리스트 이해도 대안으로 사용될 수 있습니다.

스크립트는 다음과 같습니다.

#!/usr/bin/env python
import os
empty=[]
for r,s,f in os.walk("."):
    if not f and not s and r != ".":
        empty.append(r)

for i in empty:
    os.rmdir(i)

단순히 질문하기에는 너무 복잡합니다 :(
nurulhudamustaqim

@nurulhudamustaqim 관점에 따라 다릅니다. 파이썬에 익숙한 많은 Linux 사용자에게는 실제로 매우 겸손합니다 :) 그리고 그 다양성 외에도. 현대 시스템 관리는 배쉬 /bin/sh에만 국한되지 않고 파이썬은 실제로이 두 언어보다 더 우아한 언어입니다.
Sergiy Kolodyazhnyy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.