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:
*
– corespunde cu zero sau mai multe caractere?
– se potrivește cu orice caracter[seq]
– se potrivește cu orice caracter din seq[!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 |
:
*(lista de modele)
– se potrivește cu zero sau mai multe apariții ale modelelor specificate?(lista de modele)
– se potrivește cu zero sau cu o apariție a modelelor specificate- +(lista de modele) – se potrivește cu una sau mai multe apariții ale modelelor specificate
@(lista de modele)
– se potrivește cu unul dintre modelele specificate!(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.