내가 아는 한, 매개변수에 디렉토리만 있고 트리 어디에도 파일이 없는 경우 rmdir
매개변수에 대한 참조를 제거하는 옵션만 있습니다 . -r
가장 쉬운 방법은 무엇입니까?
답변1
GNU find
및 현재 BSD find
(macOS 포함)에는 -delete
이러한 목적으로 사용할 수 있는 작업이 있습니다.
find . -type d -empty -delete
모든 빈 디렉터리를 찾아서 삭제합니다. 이 -delete
작업은 깊이 우선 처리를 활성화하므로 다른 디렉터리만 포함하고 하위 디렉터리에는 파일이 없는 디렉터리가 삭제됩니다.
답변2
zsh 셸을 사용하여 인수를 (하위)디렉토리 목록으로 반복적으로 확장하고 깊이 역순으로 정렬한 다음 rmdir
목록을 순차적으로 처리할 수 있습니다. 각 디렉토리가 비어 있는 경우에만 경고와 함께 성공합니다(그리고아니요비어있지 않은 디렉토리를 삭제합니다. 이로 인해 빈 디렉터리 트리가 제거되고 디렉터리가 비어 있지 않으면 경고가 표시됩니다.
bydepth
기능 을 빌렸어요스테판의 답변은 여기에 있습니다.
bydepth() REPLY=${REPLY//[^\/]}
rmdir **/(/O+bydepth)
이 bydepth
함수는 슬래시가 아닌 모든 문자를 제거하여 REPLY 변수를 (재)설정합니다. 그런 다음 glob 한정자의 정렬 기능은 O+
REPLY 문자열을 사용하여 가장 긴 것부터 정렬합니다. 또 다른 glob 한정자는 /
디렉터리만 선택한다는 것입니다. 초기 **/
와일드카드는 zsh에게 현재 디렉터리에서 재귀적으로 확장하도록 지시합니다.
샘플 실행:
$ : no files exist
$ mkdir -p a/b/c/d
$ find .
.
./a
./a/b
./a/b/c
./a/b/c/d
$ rmdir **/(/O+bydepth)
$ find .
.
$
$ : a file exists
$ mkdir -p a/b/c/d
$ touch a/b/c/somefile
$ find .
.
./a
./a/b
./a/b/c
./a/b/c/d
./a/b/c/somefile
$ rmdir **/(/O+bydepth)
rmdir: failed to remove ‘a/b/c/’: Directory not empty
rmdir: failed to remove ‘a/b/’: Directory not empty
rmdir: failed to remove ‘a/’: Directory not empty
$ find .
.
./a
./a/b
./a/b/c
./a/b/c/somefile