3 maneres d'esborrar tots els fitxers d'un directori excepte un o pocs fitxers amb extensions


De vegades us trobeu en una situació en què necessiteu suprimir tots els fitxers d'un directori o simplement netejar un directori eliminant tots els fitxers, excepte els fitxers d'un tipus determinat (que acaben amb una extensió determinada).

En aquest article, us mostrarem com esborrar fitxers d'un directori, excepte determinades extensions o tipus de fitxers mitjançant les ordres rm, find i globignore.

Abans d'avançar, comencem fent una ullada breu a un concepte important a Linux: la concordança de patrons de nom de fitxer, que ens permetrà tractar el nostre problema.

A Linux, un patró d'intèrpret d'ordres és una cadena que consta dels següents caràcters especials, que s'anomenen comodins o metacaràcters:

  1. *: coincideix amb zero o més caràcters
  2. ?: coincideix amb qualsevol caràcter únic
  3. [seq]: coincideix amb qualsevol caràcter de seq
  4. [!seq]: coincideix amb qualsevol caràcter que no sigui seq

Hi ha tres mètodes possibles que explorarem aquí, i aquests inclouen:

Suprimeix fitxers amb operadors de concordança de patrons ampliats

Els diferents operadors de concordança de patrons estès es mostren a continuació, on la llista de patrons és una llista que conté un o més noms de fitxer, separats amb el caràcter |:

  1. *(llista de patrons): coincideix amb zero o més ocurrències dels patrons especificats
  2. ?(llista de patrons): coincideix amb zero o una ocurrència dels patrons especificats
  3. +(llista de patrons): coincideix amb una o més ocurrències dels patrons especificats
  4. @(lista de patrons): coincideix amb un dels patrons especificats
  5. !(llista de patrons): coincideix amb qualsevol cosa excepte amb un dels patrons donats

Per utilitzar-los, activeu l'opció de shell extglob de la següent manera:

# shopt -s extglob

1. Per suprimir tots els fitxers d'un directori excepte el nom de fitxer, escriviu l'ordre següent:

$ rm -v !("filename")

2. Per suprimir tots els fitxers amb l'excepció de filename1 i filename2:

$ rm -v !("filename1"|"filename2") 

3. L'exemple següent mostra com eliminar tots els fitxers que no siguin tots els fitxers .zip de manera interactiva:

$ rm -i !(*.zip)

4. A continuació, podeu suprimir tots els fitxers d'un directori a part de tots els fitxers .zip i .odt de la següent manera, mentre mostreu el que s'està fent:

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

Un cop tingueu totes les ordres necessàries, desactiveu l'opció d'intèrpret d'ordres extglob d'aquesta manera:

$ shopt -u extglob

Suprimeix fitxers amb l'ordre find de Linux

Amb aquest mètode, podem utilitzar l'ordre find exclusivament amb les opcions adequades o juntament amb l'ordre xargs utilitzant una canalització com en els formularis següents:

$ 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. L'ordre següent suprimirà tots els fitxers a part dels fitxers .gz del directori actual:

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

6. Mitjançant un pipeline i xargs, podeu modificar el cas anterior de la següent manera:

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

7. Vegem un exemple addicional, l'ordre següent esborrarà tots els fitxers, excepte els fitxers .gz, .odt i .jpg al directori actual:

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

Suprimeix fitxers amb la variable Bash GLOBIGNORE

Tanmateix, aquest últim enfocament només funciona amb bash. Aquí, la variable GLOBIGNORE emmagatzema una llista de patrons separada per dos punts (noms de fitxers) per ser ignorada per l'expansió del nom de ruta.

Per utilitzar aquest mètode, aneu al directori que voleu netejar i, a continuació, configureu la variable GLOBIGNORE de la següent manera:

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

En aquest cas, tots els fitxers que no siguin .odt, .iso i .txt s'eliminaran del directori actual.

Ara executeu l'ordre per netejar el directori:

$ rm -v *

Després, desactiveu la variable GLOBIGNORE:

$ unset GLOBIGNORE

Nota: per entendre el significat dels senyaladors emprats a les ordres anteriors, consulteu les pàgines man de cada comanda que hem utilitzat a les diferents il·lustracions.

Això és tot! Si teniu altres tècniques de línia d'ordres en ment amb el mateix propòsit, no us oblideu de compartir amb nosaltres a través de la nostra secció de comentaris a continuació.