Linux에서 빈 파일과 디렉터리를 모두 재귀적으로 삭제하려면 어떻게 해야 합니까?

Linux에서 빈 파일과 디렉터리를 모두 재귀적으로 삭제하려면 어떻게 해야 합니까?

상위 디렉터리의 모든 빈 파일과 디렉터리를 재귀적으로 정리하려면 어떻게 해야 합니까?

다음과 같은 디렉터리 구조가 있다고 가정해 보겠습니다.

Parent/
  |____Child1/
        |______ file11.txt (empty)
        |______ Dir1/ (empty)

  |____Child2/
        |_______ file21.txt
        |_______ file22.txt (empty)

  |____ file1.txt

나는 이것으로 끝나야합니다 :

Parent/
  |____Child2/
        |_______ file21.txt

  |____ file1.txt

답변1

이것은 정말 간단한 하나의 라이너입니다.

find Parent -empty -delete

그것은 꽤 자명하다. 확인했을 때 Parent/Child1이 성공적으로 삭제되었다는 사실에 놀랐습니다. 일반적으로 를 지정하지 않는 한 자식보다 부모를 먼저 처리할 것으로 예상합니다 -depth.

이것은 -delete암시하기 때문에 작동합니다 -depth. 참조GNU 찾기 매뉴얼:

-delete파일 삭제; 제거에 성공하면 true입니다. 제거에 실패하면 오류 메시지가 표시됩니다. -delete가 실패하면 find의 종료 상태는 0이 아닙니다(결국 종료될 때). -delete를 사용하면 -length 옵션이 자동으로 활성화됩니다.


이러한 기능은Posix 표준, 그러나 대부분의 Linux 배포판에 있을 가능성이 높습니다. Alpine Linux와 같은 소규모 Linux를 기반으로 하는 경우 특정 문제가 발생할 수 있습니다.비지박스이는 지원하지 않습니다 -empty.

비표준을 포함 -empty하고 다음 -delete을 포함하는 기타 시스템BSD그리고OSX하지만 분명히 그렇지 않다AIX.

답변2

두 가지 명령 솔루션은 다음과 같습니다.

빈 파일 삭제

find Parent/ -type f -size 0 -delete

제거해 보세요모두디렉토리

find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>/dev/null

NB는 rmdir비어 있지 않은 디렉토리를 제거할 수 없으므로 실행하는 것은 안전하지만 우리가 숨기고 있는 오류가 발생합니다.

위와 같지만 무시되는 오류 메시지에 대해 좀 더 구체적입니다. 배포판에 따라 메시지가 다른 경우 수정해야 할 수도 있습니다.

find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>&1 \
  | grep -iv "Directory not empty$"

답변3

도구 를 사용하여 이 작업을 수행할 수도 있습니다 fd.

fd -t e -x rm -r

https://github.com/sharkdp/fd

관련 정보