~에서https://unix.stackexchange.com/a/24163/167166
find . -type d -depth -empty -exec rmdir "{}" \;
먼저 첫 번째 빈 디렉터리를 찾을 때까지 디렉터리 트리를 드릴다운한 다음 삭제합니다. 따라서 상위 디렉토리를 비운 다음 삭제하는 등의 작업을 수행합니다. 이렇게 하면 원하는 효과가 나올 것입니다. (아마 일주일에 10번 정도 이 작업을 수행하므로 이것이 맞다고 확신합니다.) :-)
하위 디렉터리가 삭제된 후 상위 디렉터리도 삭제되도록 하는 방법은 무엇입니까?
감사해요.
답변1
~에서find
맨페이지:
-depth
각 디렉터리의 내용은 디렉터리 자체를 처리하기 전에 처리됩니다. 행동은-delete
또한 힌트를 줍니다-depth
.
그리고
find . -type d -depth -empty -exec rmdir "{}" \;
find
현재 디렉터리부터 시작하여 그 안에 포함된 모든 파일과 디렉터리(및 하위 디렉터리 등)를 찾은 다음 디렉터리의 내용부터 시작하여 상위 디렉터리를 처리하면서 각 디렉터리를 처리합니다. 다음 트리를 상상해 보세요.
.
├── a
│ ├── c
│ └── d
│ └── e
└── b
find . -depth
처리 순서를 표시합니다.
./a/c
./a/d/e
./a/d
./a
./b
.
보시다시피, 자식은 부모보다 먼저 나열됩니다. 더 복잡한 find
명령에서는 해당 작업이 부모보다 먼저 자식에게 적용됩니다. 빈 리프 디렉터리가 먼저 처리되고 비어 있으면 부모가 삭제됩니다. 만약에그들은비어 있음(빈 자식이 제거되었기 때문에 그럴 수 있음)도 제거되고 현재 디렉터리로 계속 돌아갑니다.
예를 들어 생략하면 -depth
파일은 열거된 순서대로 처리됩니다.find
.
./a
./a/c
./a/d
./a/d/e
./b
따라서 .
먼저 처리되어 비어 있지 않으므로 그대로 둡니다. 음 a
, 마찬가지입니다. 그런 다음 a/c
;은 비어 있으므로 삭제됩니다. 그대로 a/d
유지하고 a/d/e
제거합니다 b
. 이미 처리된 디렉터리는 다시 방문되지 않으므로 삭제 를 find
원하더라도 그대로 유지됩니다 a
.a/d