이 명령은 하위 디렉터리가 삭제된 후 상위 디렉터리도 삭제된다는 것을 어떻게 인식합니까?

이 명령은 하위 디렉터리가 삭제된 후 상위 디렉터리도 삭제된다는 것을 어떻게 인식합니까?

~에서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

관련 정보