폴더 내의 폴더 내에 폴더가 포함된 폴더가 있습니다. 일부 폴더에는 파일이 있고 일부 폴더에는 없습니다. 파일이 없는 모든 디렉터리를 찾아 삭제하여 홈 폴더를 정리하고 싶습니다. 예를 들면 다음과 같습니다.
그래서 내가 이것부터 시작한다면 :
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
해결책
이 작업을 수행하기 위한 몇 가지 스위치 조합이 있을 수 있지만 find
Python 방식이 더 간단하다고 생각합니다(그리고 크로스 플랫폼이므로 필요하지는 않습니다).
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에서 예외가 발생합니다! 실제로 이 두 단계 사이의 시간은 마이크로초 단위로 측정되므로 이는 큰 문제가 아니지만 알아두어야 할 사항입니다.