Kịch bản dưới đây sẽ làm chính xác như bạn mô tả, nó:
- liệt kê các thư mục trong một thư mục
Nhìn vào bên trong mỗi thư mục cho một thư mục có tên "Ghi âm"
- Nếu nó tồn tại và trống, nó sẽ xóa thư mục ưu việt của nó
- nếu nó không tồn tại, nó cũng xóa thư mục cao cấp của nó
- các tệp ở cấp độ đầu tiên bên trong A sẽ không bị xóa.
Trong một hình ảnh:
A
|
|--------123456
| |
| |----Recording
| |----a.txt
| |----b.txt
|
|
|--------635623
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------123456
| |----Recording
| |----a.txt
| |----b.txt
|
|--------Monkey.txt
sẽ cho kết quả:
A
|
|
|--------635623
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------Monkey.txt
Kịch bản
#!/usr/bin/env python3
import os
import sys
import shutil
dr = sys.argv[1]
def path(*args):
return os.path.join(*args)
for d in os.listdir(dr):
try:
if not os.listdir(path(dr, d, "Recording")):
shutil.rmtree(path(dr,d))
except FileNotFoundError:
shutil.rmtree(path(dr,d))
except NotADirectoryError:
pass
Để sử dụng
- Sao chép tập lệnh vào một tập tin trống, lưu nó dưới dạng
delete_empty.py
Chạy nó với thư mục (full!) (Chứa các thư mục con của bạn, A trong ví dụ của bạn) làm đối số bằng lệnh:
python3 /path/to/delete_empty.py /path/to/directory
Đó là nó.
Giải trình
Cung cấp nội dung của thư mục "A" cho tập lệnh,
os.listdir(dr)
sẽ liệt kê các thư mục con của nó (và các tệp). Sau đó:
if not os.listdir(path(dr, d, "Recording"))
sẽ cố gắng liệt kê nội dung của từng thư mục (phụ), điều này sẽ gây ra lỗi nếu mục đó là một tệp:
except NotADirectoryError
pass
hoặc nếu thư mục "Ghi âm" hoàn toàn không tồn tại:
FileNotFoundError
shutil.rmtree(path(dr,d))
Nếu thư mục "Ghi âm" tồn tại và trống, thư mục ưu việt sẽ bị xóa:
if not os.listdir(path(dr, d, "Recording")):
shutil.rmtree(path(dr,d))
BIÊN TẬP
Ngoài ra, như được yêu cầu trong các nhận xét, một phiên bản sẽ kiểm tra nhiều thư mục con (tên).
Trong trường hợp thư mục chứa bất kỳ thư mục con nào được liệt kê (không trống), thư mục sẽ được giữ. Khác nó sẽ bị xóa.
Để sử dụng
- Sao chép tập lệnh vào một tập tin trống, lưu nó dưới dạng
delete_empty.py
Chạy nó với thư mục (full!) (Có chứa các thư mục con của bạn, A trong ví dụ của bạn) và tên của các thư mục con dưới dạng đối số của lệnh:
python3 /path/to/delete_empty.py /path/to/directory <subdir1> <subdir2> <subdir3>
Đó là nó.
Kịch bản
#!/usr/bin/env python3
import shutil
import os
import sys
dr = sys.argv[1]; matches = sys.argv[2:]
def path(*args):
return os.path.join(*args)
for d in os.listdir(dr):
# delete directory *unless* either one of the listed subdirs has files
keep = False
# check for each of the listed subdirs(names)
for name in matches:
try:
if os.listdir(path(dr, d, name)):
keep = True
break
except NotADirectoryError:
# if the item is not a dir, no use for other names to check
keep = True
break
except FileNotFoundError:
# if the name (subdir) does not exist, check for the next
pass
if not keep:
# if there is no reason to keep --> delete
shutil.rmtree(path(dr,d))
Ghi chú
Trước tiên hãy chạy trên một thư mục thử nghiệm để đảm bảo nó thực hiện chính xác những gì bạn muốn.