नीचे दी गई स्क्रिप्ट ठीक वैसा ही करेगी जैसा आप वर्णन करते हैं:
- एक निर्देशिका के अंदर फ़ोल्डरों को सूचीबद्ध करता है
"रिकॉर्डिंग" नामक एक फ़ोल्डर के लिए प्रत्येक फ़ोल्डर के अंदर दिखता है
- यदि यह मौजूद है और खाली है, तो यह अपने बेहतर फ़ोल्डर को हटा देता है
- यदि यह मौजूद नहीं है, तो यह अपने बेहतर फ़ोल्डर को भी हटा देता है
- ए के अंदर पहले स्तर की फाइलें हटाई नहीं जाएंगी।
एक छवि में:
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
या यदि फ़ोल्डर "रिकॉर्डिंग" मौजूद नहीं है:
FileNotFoundError
shutil.rmtree(path(dr,d))
यदि फ़ोल्डर "रिकॉर्डिंग" मौजूद है और खाली है, तो बेहतर फ़ोल्डर हटा दिया गया है:
if not os.listdir(path(dr, d, "Recording")):
shutil.rmtree(path(dr,d))
संपादित करें
इसके अतिरिक्त, जैसा कि टिप्पणियों में अनुरोध किया गया है, एक संस्करण जो कई सबडिर्म्स (नामों) के लिए जांच करेगा।
यदि निर्देशिका में कोई भी सूचीबद्ध (अन-खाली) उपखंड शामिल है, तो निर्देशिका को रखा जाता है। इसे हटा दिया जाएगा।
काम में लाना
- स्क्रिप्ट को एक खाली फ़ाइल में कॉपी करें, इसे इस रूप में सहेजें
delete_empty.py
इसे (पूर्ण!) निर्देशिका के साथ चलाएं (आपके उपखंड, आपके उदाहरण में A) और कमांड द्वारा तर्क के रूप में उपखंड के नाम:
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))
ध्यान दें
कृपया परीक्षण निर्देशिका पर पहले यह सुनिश्चित करने के लिए दौड़ें कि यह वही है जो आप चाहते हैं।