빈 디렉터리나 파일이 없는 디렉터리를 반복적으로 찾습니다.

빈 디렉터리나 파일이 없는 디렉터리를 반복적으로 찾습니다.

명령이 있지만 find . -type d -empty문자 그대로 빈 디렉토리만 찾을 수 있습니다.

내가 달성하고자 하는 것은 약간 복잡합니다. 빈 디렉터리나 다른 디렉터리만 있는 디렉터리 또는 빈 디렉터리를 찾고 싶고 이 규칙을 재귀적으로 전달해야 합니다.

예를 들어, 이 디렉토리 구조에서는 다음을 찾습니다. 그러나 ~1/11/111/ 트리 1/의 어느 지점에든 파일이 있는 경우(예: 이 경우) 파일이 있는 경우 해당 파일 이전의 파일을 반환해서는 안 됩니다. 그것 . 따라서 옆에 빈 디렉터리가 있으면 1111이 반환되어야 합니다.1/11/1/11/111/1/11/111/file11/11/111/1111/1/11/111/file1

내가 이것을 원하는 이유는 빈 폴더를 삭제하고 싶기 때문입니다.

이제는 반복해서 실행하여 이 작업을 수행할 수 있지만 find . -type d -empty -delete삭제하기 전에 시각화할 수 있는 방법을 원합니다.

가능합니까?

답변1

삭제된 디렉터리를 보려면 다음을 삽입하세요 -print.

find . -type d -empty -print -delete

삭제된 디렉토리의 경로 이름을 표시하면서 현재 빈 디렉토리 아래의 모든 하위 계층을 삭제합니다.

-delete작업은 -depth탐색이 디렉터리 구조의 맨 아래부터 시작하여 위쪽으로 진행됨을 의미합니다(깊이 우선 탐색). 이는 삭제 대상으로 간주될 수 있는 모든 디렉터리의 하위 디렉터리가 이미 처리되었음을 의미합니다(비어 있는 경우 해당 하위 디렉터리는 삭제됩니다).

예:

$ mkdir -p 1/2/3/4/5/6
$ tree
.
`-- 1
    `-- 2
        `-- 3
            `-- 4
                `-- 5
                    `-- 6

6 directories, 0 file
$ find . -type d -empty -print -delete
./1/2/3/4/5/6
./1/2/3/4/5
./1/2/3/4
./1/2/3
./1/2
./1
$ tree
.

0 directory, 0 file

디렉토리에 파일이 있는 경우:

$ mkdir -p 1/2/3/4/5/6
$ touch 1/2/3/file
$ tree
.
`-- 1
    `-- 2
        `-- 3
            |-- 4
            |   `-- 5
            |       `-- 6
            `-- file

6 directories, 1 file
$ find . -type d -empty -print -delete
./1/2/3/4/5/6
./1/2/3/4/5
./1/2/3/4
$ tree
.
`-- 1
    `-- 2
        `-- 3
            `-- file

3 directories, 1 file

삭제하지 않고 하위 디렉터리만 포함하는 디렉터리를 나열합니다( 사용 bash).

shopt -s globstar
for dir in ./**/; do
    if [ -z "$(find "$dir" ! -type d -exec echo x \;)" ]; then
        printf '%s\n' "$dir"
    fi
done

이는 현재 디렉토리의 모든 하위 디렉토리를 반복하고( **쉘 글로브를 사용하여) 디렉토리가 아닌 하위 디렉토리 중 하나의 내용을 찾으려고 시도합니다. 무언가가 발견되면 디렉토리는 비어 있지 않으며, 그렇지 않으면 빈 디렉토리의 경로 이름이 출력됩니다.

GNU를 사용하면 위 명령의 맨 끝 부분 (뒷부분 )에 find추가하여 작업 속도를 높일 수 있습니다.-quitfind\;

답변2

디렉터리를 삭제하지 않고 빈 디렉터리를 인쇄하려면 나뭇잎에서 위쪽으로 빈 디렉터리를 제거하는 것 이상의 작업을 수행해야 합니다.

다음과 같이 작동할 수 있습니다.

find dir/ -type d ! -exec sh -c \
  'find "$1" ! -type d -print -quit | grep -q . >/dev/null' sh {} \; -print

외부에서 각 디렉토리를 찾아 find실행하십시오.다른 find그들 각각에. find디렉터리에 디렉터리가 아닌 항목이 포함되어 있는지(반복적으로) 내부적으로 확인하고 포함된 경우 true를 반환합니다. 그런 다음 findfalse를 반환하는 각 디렉터리(즉, 디렉터리가 아닌 디렉터리를 포함하지 않음)를 외부적으로 인쇄합니다.

그러나 find재귀적 s의 경우 이는 상당히 느립니다. 더 나은 해결책은 파일이 있는 디렉터리를 캐싱하거나 빈 디렉터리에서 시작하여 파일이 포함된 분기까지 작업하는 방법을 포함할 수 있습니다.

관련 정보