3 moduri de a șterge toate fișierele dintr-un director, cu excepția unuia sau a câtorva fișiere cu extensii


Uneori ajungeți într-o situație în care trebuie să ștergeți toate fișierele dintr-un director sau pur și simplu să curățați un director eliminând toate fișierele, cu excepția fișierelor de un anumit tip (se termină cu o anumită extensie).

În acest articol, vă vom arăta cum să ștergeți fișierele dintr-un director, cu excepția anumitor extensii sau tipuri de fișiere, folosind comenzile rm, find și globignore.

Înainte de a trece mai departe, să începem prin a arunca o privire pe scurt la un concept important în Linux – potrivirea modelului de nume de fișiere, care ne va permite să ne ocupăm de problema în cauză.

Lectură sugerată: utilizați comanda find pentru a căuta mai multe nume de fișiere/extensii în Linux

În Linux, un model shell este un șir care constă din următoarele caractere speciale, care sunt denumite caractere metacaractere sau metacaractere:

  1. * – corespunde cu zero sau mai multe caractere
  2. ? – se potrivește cu orice caracter
  3. [seq] – se potrivește cu orice caracter din seq
  4. [!seq] – se potrivește cu orice caracter care nu este în seq

Există trei metode posibile pe care le vom explora aici și acestea includ:

Ștergeți fișierele utilizând operatori de potrivire a modelelor extinse

Diferiții operatori de potrivire a modelelor extinse sunt listați mai jos, unde lista de modele este o listă care conține unul sau mai multe nume de fișiere, separate folosind caracterul |:

  1. *(lista de modele) – se potrivește cu zero sau mai multe apariții ale modelelor specificate
  2. ?(lista de modele) – se potrivește cu zero sau cu o apariție a modelelor specificate
  3. +(lista de modele) – se potrivește cu una sau mai multe apariții ale modelelor specificate
  4. @(lista de modele) – se potrivește cu unul dintre modelele specificate
  5. !(lista de modele) – se potrivește cu orice, cu excepția unuia dintre modelele date

Pentru a le utiliza, activați opțiunea shell extglob după cum urmează:

shopt -s extglob

1. Pentru a șterge toate fișierele dintr-un director, cu excepția numelui fișierului, tastați comanda de mai jos:

rm -v !("filename")

2. Pentru a șterge toate fișierele, cu excepția filename1 și filename2:

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

3. Exemplul de mai jos arată cum să eliminați interactiv toate fișierele, altele decât toate fișierele .zip:

rm -i !(*.zip)

4. În continuare, puteți șterge toate fișierele dintr-un director, în afară de toate fișierele .zip și .odt, după cum urmează, în timp ce afișați ceea ce este în curs Terminat:

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

După ce aveți toate comenzile necesare, dezactivați opțiunea shell extglob astfel:

shopt -u extglob

Ștergeți fișiere folosind comanda Linux find

În cadrul acestei metode, putem folosi comanda find exclusiv cu opțiunile adecvate sau împreună cu comanda xargs utilizând o conductă ca în formularele de mai jos:

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. Următoarea comandă va șterge toate fișierele cu excepția fișierelor .gz din directorul curent:

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

6. Folosind un pipeline și xargs, puteți modifica cazul de mai sus după cum urmează:

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

7. Să ne uităm la un exemplu suplimentar, comanda de mai jos va șterge toate fișierele, cu excepția .gz, .odt și fișiere .jpg din directorul curent:

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

Ștergeți fișierele folosind variabila Bash GLOBIGNORE

Cu toate acestea, această ultimă abordare funcționează numai cu bash. Aici, variabila GLOBIGNORE stochează o listă de modele separate prin două puncte (nume de fișiere) pentru a fi ignorată de extinderea numelui de cale.

Lectură sugerată: 12 exemple practice utile despre comanda Grep în Linux

Pentru a utiliza această metodă, treceți în directorul pe care doriți să îl curățați, apoi setați variabila GLOBIGNORE după cum urmează:

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

În acest caz, toate fișierele cu excepția fișierelor .odt, .iso și .txt vor fi eliminate din directorul curent.

Acum rulați comanda pentru a curăța directorul:

rm -v *

După aceea, dezactivați variabila GLOBIGNORE:

unset GLOBIGNORE

Notă: pentru a înțelege semnificația steagurilor folosite în comenzile de mai sus, consultați paginile de manual ale fiecărei comenzi pe care le-am folosit în diferitele ilustrații.

Asta e tot! Dacă aveți în minte alte tehnici de linie de comandă în același scop, nu uitați să ne împărtășiți prin secțiunea noastră de feedback de mai jos.