빈 디렉토리를 재귀적으로 검색

빈 디렉토리를 재귀적으로 검색

예를 들어 /home/.../Desktop에서 모든 빈 디렉토리를 어떻게 찾을 수 있습니까? 저는 Solaris를 사용하고 있기 때문에 이 명령을 사용할 수 없습니다 find . -empty -type d. 다른 방법이 있나요?

답변1

(나는 편리한 Solaris 시스템이 없어서 맨페이지를 사용하고 있으므로 여기에서 구문을 약간 다루어야 할 수도 있습니다.)

디렉토리가 (단일) 디렉토리 항목에 추가되지 않는 한 UNIX에서는 빈 dir디렉토리 의 링크 수가 2라는 사실을 활용할 수 있습니다. dir/.디렉토리 항목이 여기에 추가됩니다. 그렇지 않으면 디렉토리에 대한 (하드) 링크가 불법이므로 이는 불변입니다. (기본적으로 1. )

-empty옵션은 Solaris에서는 지원되지 않지만하다-links <n>정확한 사물 검색을 지원하는 옵션N링크. 그래서 당신이 원하는 명령은 (나는생각하다; 아래 참조)는 다음과 같습니다.

find /home/.../Desktop -type d -links 2 -print

그런데...

"재귀적으로"라는 단어를 사용하는 것은 약간 모호합니다. 따라서 빈 디렉터리만 포함하는 디렉터리는 검색되지 않습니다(또는 재귀적으로). 원한다면, 순서대로 식별하고 싶다면 문제는 간단하다삭제해. 위의 명령을 반복적으로 실행하고 -exec rmdir {} \;더 이상 명령이 없을 때까지 추가하면 트리의 한 수준 더 깊은 상위 항목이 삭제되므로 해당 명령이 없으면 여러 번 실행할 필요가 없습니다.매우깊은 디렉터리 트리는 빈 디렉터리로만 구성됩니다. (Solaris의 사용 방식에 따라찾기(1)작동합니다. 한 번만 실행할 수도 있을 것 같습니다 find . -type d -exec rmdir -p {};( -p옵션에서목차(1)빈 디렉터리가 포함된 디렉터리를 삭제할 수 있지만 삭제된 디렉터리를 반복하려고 시도하기 때문에 무시할 수 있는 여러 오류 메시지가 관심을 가질 만한 오류 메시지와 혼합되어 표시되므로 그렇게 합니다. 대신에 이것을 반복적으로 수행합니다. )

-depth(이 옵션 은 참고하세요.찾기(1)파일이 있으므로 여기서는 도움이 되지 않습니다.통계()링크 수를 업데이트하기에는 너무 이릅니다. 그렇지 않으면 실행할 수 find -depth $dir -type d -links 2 -exec rmdir {} \;있으며 한 번만 실행하면 충분합니다. )

당신이 식별하고 싶다면둘 다"본질적으로 비어 있는" 디렉토리와 삭제하지 않고 빈 디렉토리만(또는 재귀적으로) 포함하는 디렉토리의 경우에는 더 복잡합니다. 나는 단일 명령줄이 가능하다고 생각하지만, 적어도 perl광기 sedawk주문 에 의지하지 않고서는 그것은 짐승이 될 것입니다(나중에 다른 사람들이 그것을 시도할 것이라고 확신합니다) .

하지만 내가 하고 싶은 것은 디렉토리 트리를 어딘가에 복사하는 것입니다./tmp/트리 복사, 그런 다음 명령을 실행하십시오.

find /tmp/tree-copy -type d -links 2 -print -exec rmdir {} \; | tee -a /tmp/empty-dirlist

더 이상 출력이 생성되지 않을 때까지 반복합니다. ( tee -a출력을 보고 파일에 추가할 수도 있습니다./tmp/빈 디렉토리 목록.)

/tmp/tree-copy그런 다음 파일의 각 줄에서 또는 무엇인가를 삭제 해야 합니다 .

perl -i -lpe 's{^/tmp/tree-copy/}{}' /tmp/empty-dirlist

이를 위해 작동하거나 텍스트 편집기를 사용할 수 있습니다.바라보다!, "빈"은 "디렉토리만 포함"으로 정의되는 빈 디렉터리 목록입니다. (원하는 경우 파이프에 넣기 전에 perl, 또는 , 또는 다른 것을 넣을 수도 있습니다 .)sedtee -a


  1. 어떤 사람들이 이것을 지적하기 전에 이것은 파일 시스템에 반드시 해당되는 것은 아닙니다.마운트 포인트;일부 운영 체제의 파일 시스템 관리자는 자신의 개인적인 목적을 위해 마운트 지점의 링크 수를 자유롭게 사용할 수 있으므로 비어 있든 없든 링크 수가 1(그렇지 않으면 불법인 ) 마운트 지점 디렉토리를 자주 볼 수 있습니다. 디렉토리의 경우) 2또는 의미가 있지만 실제 링크 수와는 아무 관련이 없는 다른 것입니다. 따라서 위 작업을 수행하려는 경우 마운트 지점을 통과할 가능성이 있는지 확인해야 합니다. 가능성은 낮지만 마운트 지점 중 하나의 링크 수가 2일 수 있기 때문입니다.

답변2

기이;

find . -type d -links 2 -exec sh -c '
    is_empty () (
        cd "$1"
        set -- .[!.]* ; test -f "$1" && return 1
        set -- ..?* ; test -f "$1" && return 1
        set -- * ; test -f "$1" && return 1
        return 0
    )
    is_empty "$0" ' {} \; -print

설명하다

-type d-links 2처음에는 결과를 "리프" 디렉터리, 즉 실제로 비어 있거나 파일만 포함하는 디렉터리로 제한하는 옵션과 함께 작동합니다. 빈 디렉토리만 고려하려면 몇 가지 사항이 더 필요합니다.

이 목적으로 일반적으로 사용되는 옵션은 -emptyPOSIX가 아닌 확장입니다. 이 단점을 극복하기 위해 빌린Rich의 sh(POSIX 쉘) 트릭. 이 -exec sh -c'...'관용구는 제가 평소에 피하는 표현이지만 아직 더 나은 대안을 찾지 못했습니다.

인용하다

관련 정보