Lo script seguente farà esattamente come lo descrivi, esso:
- elenca le cartelle all'interno di una directory
Cerca all'interno di ciascuna delle cartelle una cartella denominata "Registrazione"
- Se esiste ed è vuoto, elimina la sua cartella superiore
- se non esiste, cancella anche la sua cartella superiore
- i file al primo livello all'interno di A non verranno eliminati.
In un'immagine:
A
|
|--------123456
| |
| |----Recording
| |----a.txt
| |----b.txt
|
|
|--------635623
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------123456
| |----Recording
| |----a.txt
| |----b.txt
|
|--------Monkey.txt
comporterà:
A
|
|
|--------635623
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------Monkey.txt
Il copione
#!/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
Usare
- Copia lo script in un file vuoto, salvalo come
delete_empty.py
Eseguilo con la directory (full!) (Contieneinf i tuoi sottodir, A nel tuo esempio) come argomento dal comando:
python3 /path/to/delete_empty.py /path/to/directory
Questo è tutto.
Spiegazione
Alimentando il contenuto della cartella "A" nello script,
os.listdir(dr)
elencherà le sue sottodirectory (e file). Poi:
if not os.listdir(path(dr, d, "Recording"))
proverà ad elencare il contenuto di ciascuna delle (sotto) cartelle, che genererà un errore se l'elemento è un file:
except NotADirectoryError
pass
o se la cartella "Registrazione" non esiste affatto:
FileNotFoundError
shutil.rmtree(path(dr,d))
Se la cartella "Registrazione" esiste ed è vuota, la cartella superiore viene rimossa:
if not os.listdir(path(dr, d, "Recording")):
shutil.rmtree(path(dr,d))
MODIFICARE
Inoltre, come richiesto nei commenti, una versione che controllerà più sottodirectory (nomi).
Nel caso in cui la directory contenga uno dei sottodirectory elencati (non vuoti), la directory viene mantenuta. Altrimenti verrà eliminato.
Usare
- Copia lo script in un file vuoto, salvalo come
delete_empty.py
Eseguilo con la directory (full!) (Contenente i tuoi sottodir, A nel tuo esempio) e i nomi dei sottodir come argomenti dal comando:
python3 /path/to/delete_empty.py /path/to/directory <subdir1> <subdir2> <subdir3>
Questo è tutto.
Il copione
#!/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))
Nota
Per prima cosa, esegui una directory di prova per assicurarti che faccia esattamente quello che vuoi.