GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Eliminare la directory padre (non vuota) se una directory figlio specifica è vuota?

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:

  1. elenca le cartelle all'interno di una directory
  2. 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

  1. Copia lo script in un file vuoto, salvalo come delete_empty.py
  2. 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

  1. Copia lo script in un file vuoto, salvalo come delete_empty.py
  2. 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.


Ubuntu
  1. Elimina una directory in Ubuntu 20.04 - I migliori metodi

  2. 'rm .*' elimina mai la directory principale?

  3. Impostazione predefinita di nuovi file e cartelle secondari alla proprietà della cartella principale?

  4. C'è un modo per fare in modo che mv crei la directory in cui spostarsi se non esiste?

  5. Come imposto la directory di lavoro del processo genitore?

Come ottenere la dimensione di una directory in Linux

Il comando pwd Linux

Come eliminare una directory in Ubuntu 20.04

Rimuovi directory in Linux - Come eliminare una cartella dalla riga di comando

Come eliminare file e directory utilizzando il terminale in Debian 10

come posso eliminare in modo ricorsivo le directory vuote nella mia home directory?