예를 들어 /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
광기 sed
나 awk
주문 에 의지하지 않고서는 그것은 짐승이 될 것입니다(나중에 다른 사람들이 그것을 시도할 것이라고 확신합니다) .
하지만 내가 하고 싶은 것은 디렉토리 트리를 어딘가에 복사하는 것입니다./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
, 또는 , 또는 다른 것을 넣을 수도 있습니다 .)sed
tee -a
- 어떤 사람들이 이것을 지적하기 전에 이것은 파일 시스템에 반드시 해당되는 것은 아닙니다.마운트 포인트;일부 운영 체제의 파일 시스템 관리자는 자신의 개인적인 목적을 위해 마운트 지점의 링크 수를 자유롭게 사용할 수 있으므로 비어 있든 없든 링크 수가
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
처음에는 결과를 "리프" 디렉터리, 즉 실제로 비어 있거나 파일만 포함하는 디렉터리로 제한하는 옵션과 함께 작동합니다. 빈 디렉토리만 고려하려면 몇 가지 사항이 더 필요합니다.
이 목적으로 일반적으로 사용되는 옵션은 -empty
POSIX가 아닌 확장입니다. 이 단점을 극복하기 위해 빌린Rich의 sh(POSIX 쉘) 트릭. 이 -exec sh -c'...'
관용구는 제가 평소에 피하는 표현이지만 아직 더 나은 대안을 찾지 못했습니다.