Ricerca nel sito web

3 modi per eliminare tutti i file in una directory tranne uno o pochi file con estensioni


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 i comandi rm, find e globignore.

Prima di proseguire, iniziamo dando brevemente uno sguardo a un concetto importante in Linux: la corrispondenza dei modelli dei nomi dei file, che ci consentirà di affrontare il problema in questione.

Lettura consigliata: utilizzare il comando find 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:

  1. *: corrisponde a zero o più caratteri
  2. ? – corrisponde a qualsiasi singolo carattere
  3. [seq] – corrisponde a qualsiasi carattere in seq
  4. [!seq] – corrisponde a qualsiasi carattere non seq

Esistono tre metodi possibili che esploreremo qui e questi includono:

Elimina file utilizzando operatori di corrispondenza modelli estesi

I diversi operatori di corrispondenza dei modelli estesi sono elencati di seguito, dove pattern-list è un elenco contenente uno o più nomi di file, separati utilizzando il carattere |:

  1. *(pattern-list) – corrisponde a zero o più occorrenze dei modelli specificati
  2. ?(pattern-list) – corrisponde a zero o una occorrenza dei modelli specificati
  3. +(elenco-pattern): corrisponde a una o più occorrenze dei modelli specificati
  4. @(pattern-list) – corrisponde a uno dei modelli specificati
  5. !(pattern-list) – corrisponde a qualsiasi cosa tranne uno dei modelli specificati

Per usarli, abilita l'opzione della shell extglob come segue:

shopt -s extglob

1. Per eliminare tutti i file in una directory tranne il nome file, 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 in modo interattivo tutti i file diversi da tutti i file .zip:

rm -i !(*.zip)

4. Successivamente, puoi eliminare tutti i file in una directory tranne tutti i file .zip e .odt come segue, visualizzando ciò che viene visualizzato Fatto:

rm -v !(*.zip|*.odt)

Una volta che hai tutti i comandi richiesti, disattiva l'opzione della shell extglob in questo modo:

shopt -u extglob

Elimina file utilizzando il comando find di Linux

Con questo metodo, possiamo utilizzare il comando find esclusivamente con le opzioni appropriate o insieme al comando xargs 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 seguente comando eliminerà tutti i file tranne i file .gz nella directory corrente:

find . -type f -not -name '*.gz'-delete

6. Utilizzando una pipeline e xargs, puoi modificare il caso precedente come segue:

find . -type f -not -name '*gz' -print0 | xargs -0  -I {} rm -v {}

7. Consideriamo un ulteriore esempio: il comando seguente cancellerà tutti i file esclusi .gz, .odt e .jpg nella directory corrente:

find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete

Elimina file utilizzando la variabile Bash GLOBIGNORE

Quest'ultimo approccio, tuttavia, funziona solo con bash. Qui, la variabile GLOBIGNORE memorizza un elenco di modelli (nomi di file) separati da due punti da ignorare dall'espansione del nome di percorso.

Lettura consigliata: 12 esempi pratici utili sul comando Grep in Linux

Per utilizzare questo metodo, spostati nella directory che desideri pulire, quindi imposta la variabile GLOBIGNORE come segue:

cd test
GLOBIGNORE=*.odt:*.iso:*.txt

In questo caso, tutti i file diversi da .odt, .iso e .txt verranno rimossi dalla directory corrente.

Ora esegui il comando per pulire la directory:

rm -v *

Successivamente, disattiva la variabile GLOBIGNORE:

unset GLOBIGNORE

Nota: per comprendere il significato dei flag utilizzati nei comandi sopra, 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 condividerle con noi tramite la nostra sezione feedback di seguito.