Explorarea comenzii ‘find’ în Linux: Ghid detaliat și exemple practice
Comanda find din Linux este un instrument extrem de versatil, oferind administratorilor de sistem posibilitatea de a localiza și administra fișierele și directoarele, având la dispoziție o gamă largă de criterii de căutare. Cu ajutorul său, se pot identifica elemente după nume, tip, extensie, dimensiune, permisiuni și multe altele.
Dincolo de localizarea simplă, comanda find combinată cu alte comenzi permite acțiuni specifice asupra rezultatelor căutării. Utilizând opțiunea -exec, administratorii pot executa comenzi externe, realizând operații precum copierea, mutarea, ștergerea sau modificarea permisiunilor fișierelor care îndeplinesc criteriile specificate, fie că este vorba de dimensiune, nume sau alt criteriu.
În acest material, vom începe cu prezentarea comenzilor de bază ale find, însoțite de exemple practice, care vor ilustra procesul de identificare a fișierelor și directoarelor. Ulterior, vom explora modul în care opțiunea -exec poate fi utilizată pentru a efectua acțiuni asupra fișierelor sau directoarelor, în funcție de diverse caracteristici, cum ar fi dimensiunea sau permisiunile.
Sintaxa generală a comenzii find este:
find {cale} {nume_fisier_sau_director} {actiune}
Unde:
cale: specifică directorul în care se efectuează căutarea.nume_fisier_sau_director: reprezintă denumirea exactă sau un pattern al fișierului sau directorului căutat.actiune: definește operația care trebuie executată, cum ar fi copierea, ștergerea, mutarea, etc.
Acest ghid detaliază modul de localizare a fișierelor și directoarelor care se potrivesc unor pattern-uri specifice. De asemenea, vom examina cum se pot efectua acțiuni asupra entităților localizate de comanda find. Materialul este conceput pe baza distribuției Ubuntu, dar principiile prezentate sunt aplicabile majorității distribuțiilor și versiunilor Linux.
Localizarea fișierelor și directoarelor
Căutarea fișierelor după nume sau extensie
Pentru a identifica un fișier anume, executați următoarea comandă de la rădăcina sistemului (/). Comanda specifică numele exact al fișierului căutat.
find . -name file22.txt
Rezultat:
./test/file22.txt ./sales/file22.txt
Rețineți că rezultatele includ calea completă. Acest aspect este esențial, mai ales atunci când nu cunoașteți locația exactă a fișierului sau când acesta se află în mai multe locuri.
De asemenea, este posibilă căutarea fișierului într-un alt director, păstrând locația curentă. În acest caz, trebuie să specificați calea către directorul vizat pentru căutare.
find ./test -name file22.txt
Căutarea fișierelor într-un director specific
În exemplul nostru, vom căuta toate fișierele al căror nume începe cu „file”, aflate în directorul „test”.
find ./test -name file*
Rezultat:
./test/file22.txt ./test/file30.doc ./test/file1.txt ./test/file5,doc
Căutarea fișierelor după extensie
Pentru a localiza fișierele cu o anumită extensie, includeți aceasta în comandă.
find . -name *.txt
Rezultat:
./test/subtest/subfil.txt ./test/file22.txt ./test/file1.txt ./home1/files32.txt ./home2/file22.txt ./qa/tags.txt
Localizarea fișierelor și directoarelor după nume
Folosiți comanda de mai jos pentru a căuta fișiere și directoare care încep cu literele „qa”. În sistemul nostru, avem fișierele „qatree.txt” și „qa.txt”, precum și un director cu numele „qa”.
Executând comanda:
find ./ -name "qa*"
Se va returna următorul rezultat:
./test/qatree.pdf ./test/qa.txt ./home/qa
Comanda afișează atât fișierele, cât și directoarele care corespund criteriilor de căutare. Pentru a identifica doar fișiere sau directoare, trebuie să specificați acest lucru în comandă.
Localizarea doar a fișierelor sau a directoarelor
Pentru a localiza doar fișiere, folosiți opțiunea -type f.
Căutarea doar a fișierelor:
find ./ -type f -name "qa*"
Rezultat:
./test/qatree.pdf ./test/qa.txt
Pentru a localiza doar directoare, utilizați opțiunea -type d.
find ./ -type d -name "qa*"
Rezultat:
./home/qa
Căutarea independentă de majuscule/minuscule
Căutările care folosesc opțiunea -name sunt sensibile la majuscule și minuscule. Pentru a obține rezultate indiferent de acestea, utilizați opțiunea -iname.
find ./ -iname "qa*"
Rezultat:
./test/qatree.pdf ./test/qa.txt ./test/QAtest.txt ./home/qa
Căutarea unui fișier în mai multe directoare
Pentru a căuta fișiere în diverse directoare, includeți căile acestora în comandă. În exemplul nostru, vom căuta în directoarele „test” și „numeric”.
find ./test ./numeric -name file22.txt -type f
Rezultat:
./test/file22.txt /root/numeric/file22.txt
Localizarea mai multor fișiere cu extensii diferite
Comanda find poate localiza simultan fișiere care au extensii variate, cum ar fi *.doc, *.txt, *.pdf, etc. Acest lucru se poate face fie separat, câte o extensie la un moment dat, fie printr-o singură comandă care specifică toate extensiile dorite.
find . -type f \( -name "*.txt" -o -name "*.pdf" -o -name "*.doc" \)
Rezultat:
./test/subtest/subfil.txt ./test/qatree.pdf ./test/file22.txt ./test/qa.txt ./test/file30.doc ./books/acro.pdf ./data1/FILE22.txt ./docs/files32.txt
Căutarea fișierelor care conțin un anumit text
Uneori, poate fi necesar să găsiți un fișier care conține un anumit text, dar al cărui nume sau locație nu le cunoașteți. Această comandă permite identificarea tuturor fișierelor care conțin textul țintă.
Pentru a căuta toate fișierele care conțin textul „hyperconvergence”, folosiți:
find / -type f -exec grep -l -i "hyperconvergence" {} ;
Rezultat:
/root/numeric/hci /root/HCIP
Opțiunea -i permite comenzii să ignore diferențele dintre majuscule și minuscule, astfel încât textul să fie găsit indiferent de modul în care a fost scris.
Pentru a căuta fișierele într-un director specific, includeți calea acestuia în comandă:
find ./numeric -type f -exec grep -l -i "hyperconvergence" {} ;
Rezultat:
./numeric/hci
Pentru a afla mai multe despre comanda grep, explorați exemple suplimentare.
Căutarea fișierelor și directoarelor după dimensiune
Puteți localiza fișiere sau directoare care sunt mai mici, egale sau mai mari decât o anumită dimensiune, aflate într-un anumit interval de dimensiuni, sau goale. Folosiți formatul de dimensiune adecvat, în funcție de tipul de fișiere sau directoare căutate.
Opțiunile de dimensiune includ:
c– octețik– kilooctețiM– MegaoctețiG– Gigabytes
Căutarea fișierelor cu o anumită dimensiune (ex. 30 MB)
Pentru a găsi toate fișierele care au exact 30 MB:
find / -size 30M
Căutarea fișierelor mai mari decât o dimensiune specificată (ex. 2MB)
find -size +2M
Rezultat:
./Downloads/ubuntu18043.iso ./.cache/pip/http/6/e/3/8/3/6e38383f41850c3e5705d48116bc52f81b92a80500f414305057 7a9c
Căutarea fișierelor mai mici de 10MB în directorul curent
find . -type f -size -10M
Căutarea fișierelor cu dimensiuni între 100 și 200 MB
Atunci când se caută fișiere într-un interval de dimensiuni specific, precum între 100 și 200 MB:
find / -size +100M -size -200M
Căutarea directoarelor mai mari de 20 KB
find / -type d -size +20k
Căutarea fișierelor și directoarelor goale
Pentru fișiere goale:
find ./ -type f -size 0
sau
find ./ -type f –empty
Pentru directoare goale:
find ./ -type d –empty
Căutarea fișierelor după vechime sau timp de modificare
Pentru a localiza fișiere mai vechi de un anumit număr de zile:
find /path/ -type f -name '*.txt' -mtime +8
-mtime +8 va căuta fișiere .txt mai vechi de 8 zile.
Căutarea după data modificării
Aceasta va căuta fișierele care au fost modificate în ultimele 17 ore:
find . -mtime -17 -type f
Pentru a căuta directoare modificate în ultimele 10 zile:
find . -mtime -10 -type d
Căutarea fișierelor bazată pe acces sau modificare
Această funcționalitate vă permite să vizualizați fișierele care au fost sau nu au fost accesate într-o perioadă specificată.
Pentru a vedea fișierele care nu au fost accesate în ultimele 10 zile în directorul principal:
find /home -atime +10
Pentru a identifica fișierele accesate exact acum 10 zile:
find /home -atime 10
Pentru a identifica fișierele accesate în ultimele 10 zile:
find /home -atime -10
Căutarea fișierelor modificate în ultimele n zile
Pentru a căuta fișierele din directorul /home modificate în ultimele 10 zile, folosiți comanda:
find /home -mtime -10
Căutarea fișierelor modificate într-o anumită perioadă
De exemplu, pentru a localiza toate fișierele din directorul principal, care au fost modificate între 6 și 15 zile în urmă:
find /home -type f -mtime +6 -mtime -15
Căutarea fișierelor și directoarelor accesate în ultimele 10 minute
Pentru a găsi fișierele care au fost accesate în ultimele 10 minute, utilizați opțiunea -amin.
find . -amin -10 -type f
Rezultat:
./.bash_history ./[email protected]:~#
Pentru a găsi directoarele care au fost accesate în ultimele 10 minute:
find . -amin -10 -type d
Căutarea fișierelor în funcție de permisiuni
Sintaxă:
find -perm mode
Unde mode reprezintă permisiunea, care poate fi numerică (ex. 644, 655, 700, 777) sau literală (ex. u=x, a=r+x).
Modul poate fi specificat în trei moduri distincte:
- Fără prefix, pentru a găsi fișierele care au exact permisiunile specificate.
- Cu
-pentru a găsi fișierele care au cel puțin permisiunea specificată. Comanda va returna fișierele cu permisiunile specificate, precum și cele cu permisiuni suplimentare, mai mari. - Cu
/, este necesar să se specifice proprietarul sau grupul cu permisiunea la fișier.
Găsirea fișierelor cu permisiunea 777
find -perm 777
Rezultat:
./file1
Găsirea fișierelor cu cel puțin permisiunea 766:
find -perm -766
Rezultat:
./file2 ./file1
Comanda caută toate fișierele în care:
- Proprietarul fișierului are permisiuni de citire, scriere și execuție.
- Grupul are permisiuni de citire și scriere.
- Alții au permisiunea de citire și scriere.
Astfel, sunt returnate două fișiere care îndeplinesc aceste criterii: „file1” și „file2”. Fișierele nu trebuie să aibă exact permisiunile 766, dar trebuie să aibă cel puțin aceste permisiuni specificate.
Găsirea fișierelor care pot fi scrise de proprietar
Vom utiliza acum / pentru a căuta fișiere care pot fi scrise fie de proprietarul lor, fie de grup, sau de alții:
find -perm /222
Rezultat:
. ./file2 ./file3 ./file1
Comanda de mai sus caută fișierele care pot fi scrise de proprietar, grup sau alții. Aceasta returnează fișierele care pot fi scrise de oricare dintre aceste categorii, dar nu neapărat de toate. Pentru a vizualiza fișierele în care ambele (proprietar și grup) au permisiuni de scriere, folosiți prefixul -:
find -perm -220
Rezultat:
./file2 ./file1
Găsirea fișierelor deținute de un anumit utilizator
Pentru a localiza toate fișierele deținute de utilizatorul „jack”:
find /home -user jack
Rezultat:
/home/jack /home/jack/examples.desktop /home/jack/.gnupg /home/jack/.gnupg/private-keys-v1.d /home/jack/ans.cgi
Găsirea anumitor tipuri de fișiere deținute de un anumit utilizator
Pentru a localiza toate fișierele text deținute de utilizatorul „jack”:
find /home -user jack -iname "*.txt"
Rezultat:
/home/jack/docs/file32.txt
Găsirea și listarea fișierelor și directoarelor împreună cu permisiunile acestora
find -name "*.conf" | ls -l
Rezultat:
total 120 drwxr-xr-x 2 root root 4096 Dec 31 13:19 backup2 drwxr-xr-x 2 root root 4096 Jan 4 11:57 Desktop drwxr-xr-x 2 root root 4096 Dec 31 11:50 Documents drwxr-xr-x 2 root root 4096 Dec 31 12:27 Downloads -rw-r--r-- 1 root root 0 Jan 4 12:02 file22.doc drwxr-xr-x 2 root root 4096 Jan 4 12:14 file23 -rw-r--r-- 1 root root 0 Jan 4 12:23 file23.txt
Găsirea și acționarea asupra rezultatelor
În această secțiune, vom examina cum se pot executa acțiuni asupra fișierelor care se potrivesc cu pattern-urile specificate în comanda find.
Găsirea fișierelor și modificarea permisiunilor
Pentru a identifica și modifica permisiunile anumitor tipuri de fișiere. Vom lucra cu fișiere PHP care au permisiuni diferite, după cum se poate vedea mai jos.
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 vary.php
Vom căuta toate fișierele PHP și le vom schimba permisiunile în 755:
find ver -name "*.php" -type f -exec chmod 755 {} ;
Această comandă caută fișierele PHP în directorul „ver” și le setează permisiunile la 755 (rwxr-xr-x).
Rezultatul:
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 vary.php
Găsirea și modificarea permisiunilor pentru fișiere și directoare
Pentru a găsi fișierele cu permisiunile 644 și a le modifica în 655:
find . -type f -perm 644 -exec chmod 655 {} ;
De asemenea, se pot căuta directoarele cu permisiunile 644 și a le înlocui cu 755:
find . -type d -perm 644
Rezultat:
./docs
Dosarul „docs” are permisiunile 644:
drwxrwxr-x 2 jack jack 4096 Jan 3 12:45 docs
Pentru a le seta la 755, executăm:
find . -type d -perm 644 -exec chmod 755 {} ;
Acum putem verifica din nou pentru a vedea ce anume 755:
find . -type d -perm 755
Rezultat:
. ./docs
Se poate observa că atât directoarele rădăcină, cât și „docs” au permisiunile 755.
Comanda ls -la oferă următoarele detalii:
drwxr-xr-x 2 jack jack 4096 Jan 3 12:45 docs
Găsirea și copierea fișierelor sau a directoarelor
Pentru a găsi și copia un fișier anume într-un director:
Comanda de mai jos va localiza fișierul „file22.txt” și îl va copia în directorul ~/tmp/images:
find -iname file22.txt -exec cp {} ~/tmp/images ;
Pentru a găsi și copia un tip de fișiere într-un director:
Pentru a găsi fișierele de tip imagine cu extensia .jpg în directorul curent și a le copia într-o locație diferită, cum ar fi un folder de imagini:
find -iname '*.jpg' -exec cp {} ~/tmp/images ;
Această comandă va găsi și copia toate fișierele .jpg în folderul ~/tmp/images.
Găsirea și copierea unui fișier în mai multe directoare
Pentru a localiza și copia un singur fișier în mai multe directoare:
find ~/tmp/dir1/ ~/tmp/dir2/ $HOME/3/ -maxdepth 0 -exec cp ~/numeric/hci {} ;
Comanda de mai sus va găsi fișierul „hci” și îl va copia în cele trei directoare /tmp/dir1/, /tmp/dir2/ și $HOME/3/.
Găsirea și mutarea fișierelor într-un alt director
Pentru a muta un fișier cunoscut dintr-un director în altul. De exemplu, pentru a muta fișierul universal.php:
find ~/folder/ -type f -name universal.php -exec mv {} ~/numeric/ ;
Pentru a căuta și muta fișierele cu o anumită extensie într-un folder diferit:
find ~/numeric/ -type f -name '*.php' -exec mv {} ~/folder/ ;
Găsirea anumitor fișiere și mutarea lor într-un folder specific
find -type f -name uni*.* -exec mv {} ~/unifiles/ ;
Această comandă va căuta toate fișierele ale căror nume încep cu „uni” și care au orice extensie și le va muta în directorul /unifiles/.
Găsirea și mutarea fișierelor în funcție de vechime
Pentru a găsi și muta fișierele mai vechi de un anumit număr de zile într-o altă locație, cum ar fi un folder de arhivă:
find /path/ -type f -name '*.pdf' -mtime +20 -exec mv {} /backup1/ ;
Această comandă va căuta fișierele .pdf mai vechi de 20 de zile și le va muta în directorul „backup1”.
Găsirea și ștergerea fișierelor și directoarelor
Sintaxa pentru găsirea și ștergerea fișierelor sau directoarelor din directorul curent este:
Pentru a șterge doar fișiere:
find . -type f -name "fisier_de_sters" -exec rm -f {} ;
Pentru a șterge doar directoare:
find . -type d -name "director_de_sters" -exec rm -rf {} ;
Găsirea și ștergerea anumitor fișiere
Pentru a găsi și șterge fișierele al căror nume începe cu „til”, utilizați:
find . -type f -name "til*" -exec rm {} ;
Pentru a găsi și șterge directoarele al căror nume începe cu „til”:
find . -type d -name "til*" -exec rm {} ;
Ștergerea atât a fișierelor, cât și a directoarelor
find . -name "til*" -exec rm -rf {} ;
Această comandă va șterge atât fișierele, cât și directoarele al căror nume începe cu literele „til”.
Ștergerea după extensie
Mai jos este modalitatea de a localiza și șterge toate fișierele .txt din directorul curent. Înlocuiți txt cu o altă extensie, cum ar fi bak, pdf sau orice altă extensie pe care doriți să o eliminați.
find . -type f -name "*.txt" -exec rm -f {} ;
În cazul în care doriți ca sistemul să vă solicite să confirmați înainte de a șterge fiecare fișier, adăugați opțiunea -i:
find . -type f -name "*.txt" -exec rm -i {} ;
Rezultat:
rm: remove regular empty file './File22.txt'? y rm: remove regular empty file './file22.txt'? y rm: remove regular empty file './file23.txt'?
În mod implicit, rm nu va elimina directoarele, și este necesară utilizarea opțiunii -r pentru a asigura o ștergere recursivă. Aceasta asigură ștergerea directoarelor, indiferent dacă sunt goale sau conțin fișiere. Opțiunea -f forțează eliminarea și este utilizată atât pentru fișiere, cât și pentru directoare.
Găsirea și ștergerea fișierelor mai vechi de n zile
Pentru a găsi și șterge fișierele de backup mai vechi de 20 de zile din directorul curent:
find . -type f -name '*.bak' -mtime +20 -exec rm {} ;
Această comandă va șterge toate fișierele .bak mai vechi de 20 de zile.
Găsirea și ștergerea doar a directoarelor
Pentru a șterge un director numit „dir22”:
find . -type d -name dir22 -exec rm -rf {} ;
Asigurați-vă că respectați majusculele și minusculele numelui directorului, sau folosiți opțiunea -iname:
find . -type d -iname Dir22 -exec rm -rf {} ;
Această comandă va șterge atât Dir22, cât și dir22.
Pentru a solicita confirmarea înainte de ștergere, utilizați opțiunea -i:
find . -type d -iname Dir22 -exec rm -rf -i {} ;
Rezultat:
rm: remove directory "./Dir22"? n rm: remove directory "./dir22"? y
În acest exemplu, am introdus „n” pentru directorul Dir22, care nu va fi șters, și „y” pentru dir22, care va fi eliminat.
Găsirea și ștergerea fișierelor goale
Puteți folosi oricare dintre următoarele comenzi pentru a localiza fișierele goale și a le șterge automat:
find ./ -type f -size 0 -exec rm -f {} ;
sau
find ./ -type f -size 0 | xargs rm -f
sau
find ./ -type f -size 0 --delete
Găsirea și ștergerea directoarelor goale
Pentru a elimina directoarele goale, vom folosi opțiunea d:
find ./ -type d -empty -exec rmdir {} ;
O altă alternativă este utilizarea opțiunii -delete în loc de -