Poniższy skrypt będzie działał dokładnie tak, jak opisano:
- wyświetla foldery w katalogu
Przeszukuje każdy z folderów w poszukiwaniu folderu o nazwie „Nagrywanie”
- Jeśli istnieje i jest pusty, usuwa folder nadrzędny
- jeśli nie istnieje, usuwa również swój folder nadrzędny
- pliki pierwszego poziomu wewnątrz A nie zostaną usunięte.
Na obrazku:
A
|
|--------123456
| |
| |----Recording
| |----a.txt
| |----b.txt
|
|
|--------635623
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------123456
| |----Recording
| |----a.txt
| |----b.txt
|
|--------Monkey.txt
spowoduje:
A
|
|
|--------635623
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------Monkey.txt
Scenariusz
#!/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
Używać
- Skopiuj skrypt do pustego pliku i zapisz go jako
delete_empty.py
Uruchom go z katalogiem (full!) (Zawiera katalogi, A w twoim przykładzie) jako argument polecenia:
python3 /path/to/delete_empty.py /path/to/directory
Otóż to.
Wyjaśnienie
Przesyłanie zawartości skryptu „A” do skryptu,
os.listdir(dr)
wyświetli listę swoich podkatalogów (i plików). Następnie:
if not os.listdir(path(dr, d, "Recording"))
spróbuje wyświetlić zawartość każdego z (pod) folderów, co spowoduje błąd, jeśli element jest plikiem:
except NotADirectoryError
pass
lub jeśli folder „Nagrywanie” w ogóle nie istnieje:
FileNotFoundError
shutil.rmtree(path(dr,d))
Jeśli folder „Nagrywanie” istnieje i jest pusty, folder nadrzędny jest usuwany:
if not os.listdir(path(dr, d, "Recording")):
shutil.rmtree(path(dr,d))
EDYTOWAĆ
Dodatkowo, zgodnie z żądaniem w komentarzach, wersja, która będzie sprawdzać wiele podkatalogów (nazw).
W przypadku, gdy katalog zawiera którykolwiek z wymienionych (niepustych) podkatalogów, katalog zostaje zachowany. W przeciwnym razie zostanie usunięty.
Używać
- Skopiuj skrypt do pustego pliku i zapisz go jako
delete_empty.py
Uruchom go z katalogiem (full!) (Zawierającym twoje podkatalogi, A w twoim przykładzie) i nazwami podkatalogów jako argumentami polecenia:
python3 /path/to/delete_empty.py /path/to/directory <subdir1> <subdir2> <subdir3>
Otóż to.
Scenariusz
#!/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))
Uwaga
Najpierw uruchom katalog testowy, aby upewnić się, że działa dokładnie tak, jak chcesz.