재귀적 rmdir의 효과 구현

재귀적 rmdir의 효과 구현

내가 아는 한, 매개변수에 디렉토리만 있고 트리 어디에도 파일이 없는 경우 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

관련 정보