Devo mantenere tutte le directory che contengono file in una sottodirectory specifica ma per eliminare resto tutte le directory in cui la sottodirectory è vuota.
Per essere più precisi ecco la struttura:
A||--------312311| || |----Registrazione| |----un.txt| |----b.txt|||--------453453| |----Registrazione| || |-------a.mp3| |----un.txt| |----b.txt|||--------566532| |----Registrazione| |----un.txt| |----b.txt
Le sottodirectory possono contenere o meno un file. Quindi ho bisogno di eliminare l'intera directory come "312311" e "566532" e solo "453453" dovrebbe essere lasciato con tutti i dati perché ha un file nella cartella "Registrazione" che è una directory specifica per me.
Ho visto molti post ma si collega a molti nomi di file specifici. Qualsiasi aiuto sarà molto apprezzato come devo fare molte volte in una settimana.
Risposta accettata:
Lo script seguente farà esattamente come descrivi:
- elenca le cartelle all'interno di una directory
-
Cerca all'interno di ciascuna cartella una cartella denominata "Registrazione"
- Se esiste e è vuoto, cancella la sua cartella superiore
- se non esiste, elimina anche la sua cartella superiore
- file al primo livello all'interno di A non verrà cancellato.
In un'immagine:
A||--------123456| || |----Registrazione| |----un.txt| |----b.txt|||--------635623| |----Registrazione| || |-------a.mp3| |----un.txt| |----b.txt|||--------123456| |----Registrazione| |----un.txt| |----b.txt||--------Scimmia.txt
risulterà in:
A|||--------635623| |----Registrazione| || |-------a.mp3| |----un.txt| |----b.txt|||--------Scimmia.txt
Il copione
#!/usr/bin/env python3import osimport sysimport shutildr =sys.argv[1]def path(*args):return os.path.join(*args)for d in os.listdir(dr ):try:if not os.listdir(percorso(dr, d, "Registrazione")):shutil.rmtree(percorso(dr,d)) eccetto FileNotFoundError:shutil.rmtree(percorso(dr,d)) eccetto NotADirectoryError:passare
Da usare
- Copia lo script in un file vuoto, salvalo come
delete_empty.py
-
Eseguilo con la directory (completa!) (contiene le tue sottodirectory, A nel tuo esempio) come argomento dal comando:
python3 /percorso/di/delete_empty.py /percorso/di/directory
Questo è tutto.
Spiegazione
Alimentando il contenuto della tua cartella "A" nello script,
os.listdir(dr)
elencherà le sue sottodirectory (e file). Quindi:
se non os.listdir(percorso(dr, d, "Registrazione"))
cercherà di elencare il contenuto di ciascuna delle (sotto)cartelle, che genererà un errore se l'elemento è un file:
tranne NotADirectoryError pass
oppure se la cartella “Registrazione” non esiste affatto:
FileNotFoundError shutil.rmtree(path(dr,d))
Se la cartella "Registrazione" esiste e è vuota, la cartella superiore viene rimossa:
se non os.listdir(percorso(dr, d, "Registrazione")):shutil.rmtree(percorso(dr,d))
MODIFICA
Inoltre, come richiesto nei commenti, una versione che verificherà la presenza di più sottodirectory (nomi).
Nel caso in cui la directory contenga qualsiasi delle sottodirectory elencate (non vuote), la directory viene conservata. Altrimenti verrà eliminato.
Da usare
- Copia lo script in un file vuoto, salvalo come
delete_empty.py
-
Eseguilo con la directory (completa!) (contenente le tue sottodirectory, A nel tuo esempio) e i nomi delle sottodirectory come argomenti con il comando:
python3 /percorso/di/cancella_empty.py /percorso/di/directory
Questo è tutto.
Correlati:cosa fa "sudo echo nameserver 8.8.8.8> /etc/resolv.conf"?Il copione
#!/usr/bin/env python3import shutilimport osimport sysdr =sys.argv[1]; corrispondenze =sys.argv[2:]def percorso(*args):restituisce os.path.join(*args)for d in os.listdir(dr):# elimina la directory *a meno che* una delle sottodirectory elencate abbia file keep =False # controlla per ciascuna delle sottodirectory(names) elencate il nome nelle corrispondenze:try:if os.listdir(path(dr, d, name)):keep =True break eccetto NotADirectoryError:# se l'elemento non è un dir, nessun uso per altri nomi da controllare keep =True break eccetto FileNotFoundError:# se il nome (subdir) non esiste, controlla per il passaggio successivo in caso contrario keep:# se non c'è motivo per mantenere --> delete shutil. rmtree(percorso(dr,d))
Nota
Per prima cosa esegui su una directory di prova per assicurarti che faccia esattamente quello che vuoi.