해결책

해결책

폴더 내의 폴더 내에 폴더가 포함된 폴더가 있습니다. 일부 폴더에는 파일이 있고 일부 폴더에는 없습니다. 파일이 없는 모든 디렉터리를 찾아 삭제하여 홈 폴더를 정리하고 싶습니다. 예를 들면 다음과 같습니다.

그래서 내가 이것부터 시작한다면 :

  • mainFolder
    • folder1
      • folder1(비어 있는)
      • folder2
        • file.txt
      • folder3(비어 있는)
    • folder2
      • folder1(비어 있는)
      • folder2(비어 있는)
      • folder3
        • folder1
          • folder1(비어 있는)
    • folder3
      • folder1
        • file.txt

나는 이렇게 끝나야 한다:

  • mainFolder
    • folder1
      • folder2
        • file.txt
    • folder3
      • folder1
        • file.txt

그래서:

  • /mainFolder/folder1/folder1파일이 없어 삭제되었습니다
  • /mainFolder/folder1/folder3파일이 없어 삭제되었습니다
  • /mainFolder/folder2파일이 없고 하위 폴더도 모두 비어 있어서 삭제되었습니다.

이것이 의미가 있기를 바랍니다...

mainFolder내 유일한 아이디어는 각 하위 폴더부터 시작하여 재귀적으로 아래로 이동하여 빈 하위 폴더를 제거하는 것입니다.

답변1

이것이 귀하의 요구 사항을 충족하는지 확인하십시오.

find mainFolder -depth -empty -type d -exec rmdir {} \;

mainFolder깊이 우선 순회를 사용하여 빈 디렉터리를 찾고 해당 디렉터리를 삭제해야 합니다 . 깊이 우선 순회를 수행하므로 하위 디렉터리를 삭제할 때 상위 디렉터리가 비어 있으면 find비어 있는 것으로 인식하고 함께 삭제합니다.

답변2

find-delete다음을 지원하는 구현을 사용하세요 -empty.

find mainFolder -type d -empty -delete

그러면 루트 디렉터리 구조의 깊이 우선 탐색이 수행되고 mainFolder그 안에 있는 빈 디렉터리가 모두 제거됩니다.

사용 표준 find:

find mainFolder -depth -type d -exec sh -c 'rmdir "$1" 2>/dev/null' sh {} ';'

rmdir이것은 다음을 사용하려고 시도합니다모든mainFolder깊이 우선 방식으로 구조를 탐색할 때의 디렉토리입니다. rmdir비어 있지 않은 디렉터리는 삭제할 수 없으므로 빈 디렉터리만 삭제됩니다 . 오류는 rmdir삭제됩니다.

실행하기 전에 각 디렉터리를 명시적으로 테스트합니다 rmdir.

find mainFolder -depth -type d -exec sh -c 'd="$1"; set -- "$d"/*; [ ! -e "$1" ] && rmdir "$d"' sh {} ';'

그러나 이는 디렉터리에 숨겨진 파일이 없다고 가정합니다.

답변3

해결책

이 작업을 수행하기 위한 몇 가지 스위치 조합이 있을 수 있지만 findPython 방식이 더 간단하다고 생각합니다(그리고 크로스 플랫폼이므로 필요하지는 않습니다).

import os

top = './mainFolder'
for root, dirs, files in os.walk(top, topdown=False):
    for name in dirs:
        dir_path = os.path.join(root, name)
        if not os.listdir(dir_path):  # An empty list is False
            os.rmdir(os.path.join(root, name))

설정 및 테스트

파일 디렉터리 생성

# https://stackoverflow.com/a/246128/295807
readonly script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

cd "$script_dir"

rm -rf mainFolder

mkdir -p mainFolder/{folder1/{folder1,folder2,folder3},folder2/{folder1,folder2,folder3/folder1/folder1},folder3/folder1}

touch mainFolder/folder1/folder2/file.txt
touch mainFolder/folder3/folder1/file.txt

시험:

$ tree mainFolder/
mainFolder/
├── folder1
│   ├── folder1
│   ├── folder2
│   │   └── file.txt
│   └── folder3
├── folder2
│   ├── folder1
│   ├── folder2
│   └── folder3
│       └── folder1
│           └── folder1
└── folder3
    └── folder1
        └── file.txt

12 directories, 2 files

Python 스크립트를 실행합니다.

python work.py

시험:

$ tree mainFolder/
mainFolder/
├── folder1
│   └── folder2
│       └── file.txt
└── folder3
    └── folder1
        └── file.txt

4 directories, 2 files

참고: Python이 폴더가 비어 있는지 확인한 후 실제로 삭제하기 전에 폴더에 파일을 추가하면 Python에서 예외가 발생합니다! 실제로 이 두 단계 사이의 시간은 마이크로초 단위로 측정되므로 이는 큰 문제가 아니지만 알아두어야 할 사항입니다.

관련 정보