A volte ti trovi in una situazione in cui devi eliminare tutti i file in una directory o semplicemente ripulire una directory rimuovendo tutti i file tranne i file di un determinato tipo (che terminano con una particolare estensione).
In questo articolo, ti mostreremo come eliminare i file in una directory ad eccezione di determinate estensioni o tipi di file utilizzando rm , trova e globignore comandi.
Prima di andare oltre, iniziamo dando un'occhiata brevemente a un concetto importante in Linux:la corrispondenza dei modelli dei nomi di file, che ci consentirà di affrontare il nostro problema.
Lettura consigliata: Usa il comando trova per cercare più nomi di file/estensioni in Linux
In Linux, un modello di shell è una stringa composta dai seguenti caratteri speciali, chiamati caratteri jolly o metacaratteri :
*
– corrisponde a zero o più caratteri?
– corrisponde a qualsiasi singolo carattere[seq]
– corrisponde a qualsiasi carattere in sequenza[!seq]
– corrisponde a qualsiasi carattere non in sequenza
Ci sono tre possibili metodi che esploreremo qui, e questi includono:
Elimina i file utilizzando gli operatori di corrispondenza dei modelli estesi
I diversi operatori di corrispondenza dei modelli estesi sono elencati di seguito, dove elenco-modello è un elenco contenente uno o più nomi di file, separati da |
carattere:
*(pattern-list)
– corrisponde a zero o più occorrenze dei modelli specificati?(pattern-list)
– corrisponde a zero o a una occorrenza dei modelli specificati- +(elenco di modelli) – corrisponde a una o più occorrenze dei modelli specificati
@(pattern-list)
– corrisponde a uno dei modelli specificati!(pattern-list)
– corrisponde a qualsiasi cosa tranne uno dei modelli indicati
Per utilizzarli, abilita extglob opzione shell come segue:
# shopt -s extglob
1. Per eliminare tutti i file in una directory eccetto nomefile, digita il comando seguente:
$ rm -v !("filename")
2. Per eliminare tutti i file ad eccezione di nomefile1 e nomefile2 :
$ rm -v !("filename1"|"filename2")
3. L'esempio seguente mostra come rimuovere tutti i file diversi da tutti i .zip
file in modo interattivo:
$ rm -i !(*.zip)
4. Successivamente, puoi eliminare tutti i file in una directory a parte tutti i .zip
e .odt
file come segue, durante la visualizzazione di ciò che si sta facendo:
$ rm -v !(*.zip|*.odt)
Una volta che hai tutti i comandi richiesti, disattiva extglob opzione shell in questo modo:
$ shopt -u extglob
Elimina file utilizzando Linux trova il comando
Con questo metodo, possiamo utilizzare il comando find esclusivamente con le opzioni appropriate o in combinazione con xargs comando utilizzando una pipeline come nei moduli seguenti:
$ find /directory/ -type f -not -name 'PATTERN' -delete $ find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {} $ find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}
5. Il comando seguente cancellerà tutti i file tranne .gz
file nella directory corrente:
$ find . -type f -not -name '*.gz'-delete
6. Utilizzando una pipeline e xargs , puoi modificare il caso sopra come segue:
$ find . -type f -not -name '*gz' -print0 | xargs -0 -I {} rm -v {}
7. Diamo un'occhiata a un ulteriore esempio, il comando seguente cancellerà tutti i file esclusi .gz
, .odt
e .jpg
file nella directory corrente:
$ find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete
Elimina i file utilizzando la variabile GLOBIGNORE di Bash
Quest'ultimo approccio, tuttavia, funziona solo con bash. Qui, il GLOBIGNORE La variabile memorizza un elenco di modelli separati da due punti (nomi di file) da ignorare dall'espansione del percorso.
Lettura consigliata: 12 utili esempi pratici sul comando Grep in Linux
Per utilizzare questo metodo, spostati nella directory che desideri ripulire, quindi imposta il GLOBIGNORE variabile come segue:
$ cd test $ GLOBIGNORE=*.odt:*.iso:*.txt
In questo caso, tutti i file diversi da .odt
, .iso
e .txt
file da rimuovere dalla directory corrente.
Ora esegui il comando per ripulire la directory:
$ rm -v *
Successivamente, disattiva GLOBIGNORE variabile:
$ unset GLOBIGNORE
Nota :Per comprendere il significato dei flag impiegati nei comandi precedenti, fare riferimento alle pagine man di ciascun comando che abbiamo utilizzato nelle varie illustrazioni.
È tutto! Se hai in mente altre tecniche da riga di comando per lo stesso scopo, non dimenticare di condividere con noi tramite la nostra sezione feedback di seguito.