답변:
GNU find
옵션과 술어를 결합 하여이 명령은 다음 작업을 수행해야합니다.
find . -type d -empty -delete
-type d
디렉토리로 제한-empty
비어있는 것으로 제한-delete
각 디렉토리를 제거합니다나무는에 -depth
의해 암시 된대로 명시 할 필요없이 나뭇잎에서 걸어 온다 -delete
.
-delete
이미 암시 -depth
하므로 수동으로 지정할 필요가 없습니다.
-mindepth 1
시작 디렉토리 자체가 비어 있으면 삭제하지 않도록 여기에 추가 합니다.
!
쉘에 특별한 의미가 있습니다. 당신은 그것을 탈출해야합니다. \! -name 'Completed'
바로 전에 : -delete
작동해야합니다. 또는이 디렉토리에 마커 파일을 넣습니다.
가장 깊게 중첩 된 디렉토리를 나열하십시오.
find . -depth -type d -exec rmdir {} \; 2>/dev/null
(리디렉션 find
은 rmdir
. 뿐만 아니라 명령 전체에 적용됩니다 . 단지 리디렉션 rmdir
을 수행하면 중간 쉘을 호출해야하므로 상당한 속도 저하가 발생합니다.)
발견 rmdir
할 -empty
술어를 전달하여 비어 있지 않은 디렉토리에서 실행 되는 것을 피할 수 있습니다 . 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를 사용하십시오. 글로브 규정이 F
때문에, 비어 있지 않은 디렉토리에 일치 /^F
빈 디렉토리와 일치합니다. 빈 디렉토리 만 포함 된 디렉토리는 쉽게 일치시킬 수 없습니다.
while rmdir **/*(/N^F); do :; done
rmdir
빈 명령 줄이 수신 되면 종료됩니다 .
-p
있습니까? 나는 그것이 차이를 만들 것이라고 생각하지 않았을 것입니다.
-empty
는 이것과 함께 작동해야합니다 (정확히 얼마나 많이 얻을지는 확실하지 않지만). 그리고 매우 사소하게, 당신은 아마 제거하고 싶지 않기 때문에를 .
사용하십시오 -mindepth 1
.
-depth
주장 을 간과 해 버렸기 때문에 rmdir -p
쓸모 없게되었다. 내 의견을 이미 변경했습니다. 90 년대는 나의 최초의 시도였다. 여기서 놀라운 것은 없습니다.
rmdir
최소한 다음 명령으로 GNU find를 사용 하여 명령 호출을 모두 제거 할 수 있다는 것을 깨달았습니다 .find . -depth -type d -empty -delete
find . -depth -type d -exec rmdir {} +
이 질문에 대한 가장 단순하고 표준을 준수하는 답변입니다.
불행히도 여기에 제공된 다른 답변은 모든 시스템에 존재하지 않는 공급 업체별 개선 사항에 달려 있습니다.
자주 사용하는 find
명령에 이러한 별칭을 사용 합니다. 특히 dupeguru를 사용하여 디스크 공간을 정리할 때 복제본을 제거하면 많은 빈 디렉토리가 생성 될 수 있습니다.
내부의 의견 .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 {} +'
rm -r */
명령은 나를 위해 쉽게 일했다. 파일이있는 디렉토리를 강제로 제거 rm
해야 -f
합니다. rm -r
빈 디렉토리 만 제거해야합니다. 나는 이것이 왜 틀릴 수 있는지에 대해 열려 있습니다. */
폴더 만 보이 므로 파일도 남겨 두어야합니다 .
rm
주로 파일을 제거하기 위해 철저히 테스트하는 것이 좋습니다 . */
디렉토리와 만 일치 하지만 더 깊은 수준에서 수행되는 작업을 모릅니다. 또한 일부 시스템에서만 작동한다고 상상할 수 있습니다.