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:
*
: coincideix amb zero o més caràcters?
: coincideix amb qualsevol caràcter únic[seq]
: coincideix amb qualsevol caràcter de seq[!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 |
:
*(llista de patrons)
: coincideix amb zero o més ocurrències dels patrons especificats?(llista de patrons)
: coincideix amb zero o una ocurrència dels patrons especificats- +(llista de patrons): coincideix amb una o més ocurrències dels patrons especificats
@(lista de patrons)
: coincideix amb un dels patrons especificats!(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ó.