'find -empty -delete'는 비어 있지 않은 디렉토리를 삭제합니다.

'find -empty -delete'는 비어 있지 않은 디렉토리를 삭제합니다.

다음 디렉토리 구조를 생성하면:

mkdir -p dir1/dir2/dir3/dir4

그런 다음 실행하면 find dir1다음이 반환됩니다.

dir1
dir1/dir2
dir1/dir2/dir3
dir1/dir2/dir3/dir4

실행하면 find dir1 -empty다음과 같이 반환됩니다.

dir1/dir2/dir3/dir4

dir4만 비어 있음을 보여줍니다.

그러나 을 실행하면 find dir1 -empty -delete4개의 디렉터리가 모두 즉시 삭제됩니다.

dir4만 삭제하고 다음 번에 명령을 실행하면 dir3만 삭제되는 식으로 진행됩니다. 왜 이런 일이 발생하며 dir4만 삭제하려면 어떻게 해야 합니까 find?

답변1

-delete암시적 -depth또는 깊이 우선 반복에 따라 find먼저 살펴보고 dir1/dir2/dir3/dir4비어 있음을 확인하고 삭제한 다음 살펴보고 dir1/dir2/dir3(현재) 비어 있음을 확인하고 삭제합니다.

GNU 매뉴얼 페이지설명하다:

-depth
각 디렉터리의 내용은 디렉터리 자체를 처리하기 전에 처리됩니다. 행동은 -delete또한 힌트를 줍니다 -depth.

그들은 일부 파일을 삭제한 다음 동시에 비울 경우(전체 하위 트리를 재귀적으로 삭제하지 않고) 해당 파일이 포함된 디렉터리를 삭제할 수 있는 것이 더 유용할 것이라고 생각했을 수 있습니다 -delete. find일치하는 모든 파일 및 디렉터리가 사라집니다. 또는 다른 방식으로 보면 (여기서 원하는 대로) 트리의 잎만 제거하는 것은 멱등성이 아닙니다. 실수로 명령을 다시 실행하면 디렉터리 트리에서 다른 수준이 제거됩니다.

어떤 경우든 기본 모드를 유지하기 위해 find실행 하고 현재 삭제된 디렉토리에 들어가지 않도록 추가할 수 있습니다. 또한 여기에 디버깅 기능을 추가 하여 무엇이 제거되는지 살펴보겠습니다.rmdir-prune-print

$ mkdir -p dir1/dir2/dir3/dir4
$ find -type d -empty -exec rmdir {} \; -prune -print
./dir1/dir2/dir3/dir4

남은 것은 다음과 같습니다.

$ find
.
./dir1
./dir1/dir2
./dir1/dir2/dir3

(여기서 rmdir실패 하면 -exec작업은 false로 평가되고 and -prune작업 -print은 실행되지 않습니다. 따라서 stdout으로의 출력에는 실제로 삭제된 내용만 포함되어야 합니다. 이는 와 다릅니다 -exec rmdir {} +.)

물론 여기서 빈 디렉토리만 삭제한다고 가정하고, 빈 파일도 삭제하려면 먼저 다음을 사용할 수 있습니다.

find -type f -empty -delete

rm또는 빌드에 rmdir파일과 디렉터리의 잘못된 조합이 필요합니다.

find -empty \( -type f -exec rm {} \; -o -type d -exec rmdir {} \; -prune \) -print

( rm -rf분명히 가능하지만 더 위험합니다.)

관련 정보