하위 트리에서 빈 디렉터리를 모두 제거하는 방법은 무엇입니까? 나는 다음과 같은 것을 사용했습니다
find . -type d -exec rmdir {} 2>/dev/null \;
하지만 빈 디렉터리만 포함된 디렉터리를 삭제하려면 여러 번 실행해야 합니다. 또한 특히 cygwin에서는 매우 느립니다.
답변1
GNU find
옵션 및 조건자와 결합하여 이 명령은 다음 작업을 수행해야 합니다.
find . -type d -empty -delete
-type d
디렉토리로 제한됨-empty
한도가 비어 있습니다.-delete
모든 디렉토리 삭제
-depth
트리는 리프부터 시작하여 탐색되며 암시된 대로 지정할 필요가 없습니다 -delete
.
답변2
깊게 중첩된 디렉터리가 먼저 나열됩니다.
find . -depth -type d -exec rmdir {} \; 2>/dev/null
(리디렉션은 find
단지 for가 아닌 전체 명령 에 적용된다는 점에 유의하십시오 rmdir
. for만 리디렉션하면 rmdir
중간 쉘을 호출해야 하기 때문에 상당한 속도 저하가 발생합니다.)
rmdir
조회에 대한 조건자를 전달하여 비어 있지 않은 디렉터리에서 실행되는 것을 방지 할 수 있습니다 -empty
. GNU는 명령을 실행하기 직전에 디렉터리를 테스트하므로 방금 비워진 디렉터리를 선택합니다.
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를 사용하십시오. 이것글로벌 예선 F
비어 있지 않은 디렉터리와 일치하므로 /^F
빈 디렉터리와 일치합니다. 빈 디렉토리만 포함된 디렉토리는 쉽게 일치시킬 수 없습니다.
while rmdir **/*(/N^F); do :; done
( rmdir
빈 명령줄이 수신되면 종료됩니다.)
답변3
find . -depth -type d -exec rmdir {} +
이 질문에 대한 가장 간단하고 표준적인 답변입니다.
불행하게도 여기에 제공된 다른 답변은 모두 모든 시스템에 존재하지 않는 공급업체별 개선 사항에 의존합니다.
답변4
find
저는 특히 다음을 사용하여 디스크 공간을 정리할 때 일반적인 명령에 이러한 별칭을 사용합니다.두퍼구루, 여기서 중복 항목을 제거하면 빈 디렉터리가 많이 생길 수 있습니다.
거기에 설명이 있으므로 .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 {} +'