GNU/Linux >> Linux Esercitazione >  >> Linux

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 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 :

  1. * – corrisponde a zero o più caratteri
  2. ? – corrisponde a qualsiasi singolo carattere
  3. [seq] – corrisponde a qualsiasi carattere in sequenza
  4. [!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:

  1. *(pattern-list) – corrisponde a zero o più occorrenze dei modelli specificati
  2. ?(pattern-list) – corrisponde a zero o a una occorrenza dei modelli specificati
  3. +(elenco di modelli) – 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 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.


Linux
  1. Come rimuovere tutti i file in una cartella tranne un file specifico in Linux

  2. Come spostare tutti i file (inclusi quelli nascosti) da una directory all'altra?

  3. File di gatto con directory?

  4. Sed:eliminare tutte le occorrenze di una stringa tranne la prima?

  5. Come eliminare tutti i file con un'estensione particolare in una cartella particolare?

Elimina tutti i file tranne che in una determinata sottodirectory con Trova?

Eliminare tutti i file in una cartella tranne l'ultimo (più recente) 20?

Sposta tutti i file tranne uno

Decomprimere tutti i file in una directory

Puoi cambiare l'autorizzazione a tutti i file tranne una directory in Linux?

Come rinominare tutti i file con caratteri speciali e spazi in una directory?