สคริปต์ด้านล่างจะตรงตามที่คุณอธิบาย:
- แสดงรายการโฟลเดอร์ภายในไดเรกทอรี
ดูภายในแต่ละโฟลเดอร์สำหรับโฟลเดอร์ที่ชื่อ "Recording"
- หากมีอยู่และว่างเปล่าก็จะลบโฟลเดอร์ที่เหนือกว่า
- ถ้ามันไม่ได้อยู่ก็ยังลบโฟลเดอร์ที่เหนือกว่า
- ไฟล์ในระดับแรกภายใน A จะไม่ถูกลบ
ในภาพ:
A
|
|--------123456
| |
| |----Recording
| |----a.txt
| |----b.txt
|
|
|--------635623
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------123456
| |----Recording
| |----a.txt
| |----b.txt
|
|--------Monkey.txt
จะส่งผลให้:
A
|
|
|--------635623
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------Monkey.txt
สคริปต์
#!/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
ใช้
- คัดลอกสคริปต์ลงในไฟล์เปล่าบันทึกเป็น
delete_empty.py
เรียกใช้ด้วยไดเรกทอรี (เต็ม!) (ประกอบด้วยส่วนย่อยของคุณ, ในตัวอย่างของคุณ) เป็นอาร์กิวเมนต์โดยคำสั่ง:
python3 /path/to/delete_empty.py /path/to/directory
แค่นั้นแหละ.
คำอธิบาย
ป้อนเนื้อหาของโฟลเดอร์ "A" ให้กับสคริปต์
os.listdir(dr)
จะแสดงรายการไดเรกทอรีย่อย (และไฟล์) แล้ว:
if not os.listdir(path(dr, d, "Recording"))
จะพยายามแสดงรายการเนื้อหาของแต่ละโฟลเดอร์ (ย่อย) ซึ่งจะทำให้เกิดข้อผิดพลาดหากรายการนั้นเป็นไฟล์:
except NotADirectoryError
pass
หรือหากไม่มีโฟลเดอร์ "Recording" อยู่เลย:
FileNotFoundError
shutil.rmtree(path(dr,d))
หากโฟลเดอร์ "Recording" มีอยู่และว่างเปล่าโฟลเดอร์ superior จะถูกลบ:
if not os.listdir(path(dr, d, "Recording")):
shutil.rmtree(path(dr,d))
แก้ไข
นอกจากนี้ตามที่ร้องขอในความคิดเห็นเวอร์ชันที่จะตรวจสอบหลายตำบล (ชื่อ)
ในกรณีที่ไดเรกทอรีมีรายการย่อย (ไม่ว่าง) ใด ๆไดเรกทอรีจะถูกเก็บไว้ มิฉะนั้นจะถูกลบ
ใช้
- คัดลอกสคริปต์ลงในไฟล์เปล่าบันทึกเป็น
delete_empty.py
รันด้วยไดเร็กทอรี (full!) (มี subdirs ของคุณ, ในตัวอย่างของคุณ) และชื่อของ subdirs เป็นอาร์กิวเมนต์โดยคำสั่ง:
python3 /path/to/delete_empty.py /path/to/directory <subdir1> <subdir2> <subdir3>
แค่นั้นแหละ.
สคริปต์
#!/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))
บันทึก
โปรดเรียกใช้ในไดเรกทอรีทดสอบก่อนเพื่อให้แน่ใจว่าทำในสิ่งที่คุณต้องการอย่างแน่นอน