it-swarm-ko.tech

하위 트리에서 빈 디렉토리를 모두 제거하는 방법은 무엇입니까?

하위 트리에서 빈 디렉토리를 모두 제거하려면 어떻게해야합니까? 나는 같은 것을 사용했다.

find . -type d -exec rmdir {} 2>/dev/null \;

그러나 빈 디렉토리 만 포함 된 디렉토리를 제거하려면 여러 번 실행해야합니다. 또한 특히 cygwin에서는 속도가 느립니다.

159
maaartinus

GNU find 옵션 및 술어를 결합하면이 명령이 작업을 수행해야합니다.

find . -type d -empty -delete
  • -type d는 디렉토리로 제한
  • -empty는 비어있는 것으로 제한합니다
  • -delete는 각 디렉토리를 제거합니다

-depth에 의해 암시 된 것처럼 -delete를 지정할 필요없이 나무가 잎에서 나옵니다.

가장 깊게 중첩 된 디렉토리를 나열하십시오.

find . -depth -type d -exec rmdir {} \; 2>/dev/null

리디렉션은 find뿐만 아니라 rmdir 명령 전체에 적용됩니다. rmdir에 대해서만 리디렉션하면 호출해야 할 때 상당한 속도 저하가 발생합니다. 중간 껍질.)

-empty 선언문을 전달하여 비어 있지 않은 디렉토리에서 rmdir을 실행하지 않도록 할 수 있습니다. GNU find 명령은 명령을 실행하려고 할 때 디렉토리를 테스트하므로 방금 비운 디렉토리가 선택됩니다.

find . -depth -type d -empty -exec rmdir {} \;

속도를 높이는 또 다른 방법은 rmdir 호출을 그룹화하는 것입니다. 둘 다 특히 Cygwin에서 원본보다 눈에 띄게 빠를 수 있습니다. 나는이 둘 사이에 큰 차이를 기대하지 않습니다.

find . -depth -type d -print0 | xargs -0 rmdir 2>/dev/null
find . -depth -type d -exec rmdir {} + 2>/dev/null

비어있는 디렉토리 수에 따라 더 빠른 방법이 있습니다. -empty를 호출 그룹화 메소드와 결합 할 수 없습니다. 빈 디렉토리 만 포함하는 디렉토리는 find에서 볼 때까지 비어 있지 않기 때문입니다.

다른 방법은 여러 패스를 실행하는 것입니다. 이것이 더 빠른지 여부는 전체 디렉토리 계층이 find 실행 사이의 디스크 캐시에 남아있을 수 있는지 여부를 포함하여 많은 것들에 달려 있습니다.

while [ -n "$(find . -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done

또는 zsh를 사용하십시오. glob 한정자F은 비어 있지 않은 디렉토리와 일치하므로 /^F는 빈 디렉토리와 일치합니다. 빈 디렉토리 만 포함 된 디렉토리는 쉽게 일치시킬 수 없습니다.

while rmdir **/*(/N^F); do :; done

(rmdir이 빈 명령 줄을 수신하면 종료됩니다.)

방금 -prmdir에서 한 번에 작동합니다. 예쁘거나 최적은 아니지만 모든 것을 얻을 수 있습니다. 이것은 rmdir에게 제거중인 디렉토리의 비어 있지 않은 부모 디렉토리를 제거하도록 지시합니다.

-empty 찾기 위해 테스트하므로 비어 있지 않은 디렉토리는 신경 쓰지 않습니다.

6
mattdm

find . -depth -type d -exec rmdir {} +

이 질문에 대한 가장 단순하고 표준을 준수하는 답변입니다.

불행히도 여기에 제공된 다른 답변은 모든 시스템에 존재하지 않는 공급 업체별 개선 사항에 달려 있습니다.

3
schily

자주 사용하는 find 명령에 이러한 별칭을 사용합니다. 특히 dupegur를 사용하여 디스크 공간을 정리할 때 중복을 제거하면 많은 빈 디렉토리가 생성 될 수 있습니다.

.bashrc 안에있는 주석이므로 나중에 수정해야 할 때도 잊지 않습니다.

# find empty directories
alias find-empty='find . -type d -empty'

# fine empty/zero sized files
alias find-zero='find . -type f -empty'

# delete all empty directories!
alias find-empty-delete='find-empty -delete'

# delete empty directories when `-delete` option is not available.
# output null character (instead of newline) as separator. used together
# with `xargs -0`, will handle filenames with spaces and special chars.
alias find-empty-delete2='find-empty -print0 | xargs -0 rmdir -p'

# alternative version using `-exec` with `+`, similar to xargs.
# {}: path of current file
# +: {} is replaced with as many pathnames as possible for each invocation.
alias find-empty-delete3='find-empty -exec rmdir -p {} +'

# for removing zero sized files, we can't de-dupe them automatically
# since they are technically all the same, so they are typically left
# beind. this removes them if needed.
alias  find-zero-delete='find-zero -delete'
alias find-zero-delete2='find-zero -print0 | xargs -0 rm'
alias find-zero-delete3='find-zero -exec rm {} +'
0
raychi

find . -type d -printf "%d %p\n" |\ sort -nr |\ Perl -pe 's/^\d+\s//;' |\ while read dir; do \ (rmdir "$dir" > /dev/null 2>&1); \ done

작동 방식은 다음과 같습니다.

  1. 깊이와 함께 모든 디렉토리를 재귀 적으로 나열
  2. 깊이의 내림차순으로 정렬
  3. 디렉토리 경로 만 필터링
  4. 목록에서 rmdir을 하나씩 실행하십시오.
0
Ashish Ranjan