Introducere
O problemă cu care se confruntă utilizatorii atunci când au de-a face pentru prima dată cu o mașină Linux este cum să găsească fișierele pe care le caută.
Acest ghid va acoperi modul de utilizare a binecunoscutei comenzi find
. Aceasta vă va ajuta să căutați fișiere pe VPS-ul dumneavoastră folosind o varietate de filtre și parametri. De asemenea, vom acoperi pe scurt comanda locate
, care poate fi folosită pentru a căuta fișiere într-un mod diferit.
Cercetarea după nume
Cel mai evident mod de a căuta fișiere este după nume.
Pentru a găsi un fișier după nume, tastați:
- find -name "query"
Aceasta va fi sensibilă la majuscule și minuscule, ceea ce înseamnă că o căutare pentru file
este diferită de o căutare pentru File
.
Pentru a găsi un fișier după nume, dar ignorați majusculele și minusculele din interogare, tastați:
- find -iname "query"
Dacă doriți să găsiți toate fișierele care nu aderă la un anumit model, puteți inversa căutarea cu -not
sau !
. Dacă folosiți !
, trebuie să scăpați caracterul pentru ca bash să nu încerce să îl interpreteze înainte ca find să poată acționa:
- find -not -name "query_to_avoid"
Or
- find \! -name "query_to_avoid"
Căutarea după tip
Puteți specifica tipul de fișiere pe care doriți să le găsiți cu parametrul -type
. Acesta funcționează astfel:
- find -type type_descriptor query
Câțiva dintre cei mai comuni descriptori pe care îi puteți folosi pentru a specifica tipul de fișier sunt aici:
-
f: fișier obișnuit
-
d: director
-
l: legătură simbolică
-
c: dispozitive de caractere
-
b: block devices
De exemplu, dacă am dori să găsim toate dispozitivele de caractere de pe sistemul nostru, am putea lansa această comandă:
- find / -type c
Output/dev/parport0/dev/snd/seq/dev/snd/timer/dev/autofs/dev/cpu/microcode/dev/vcsa7/dev/vcs7/dev/vcsa6/dev/vcs6/dev/vcsa5/dev/vcs5/dev/vcsa4. . .
Pot fi căutate toate fișierele care se termină în .conf
astfel:
- find / -type f -name "*.conf"
Output/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf/usr/share/base-files/nsswitch.conf/usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf/usr/share/rsyslog/50-default.conf/usr/share/adduser/adduser.conf/usr/share/davfs2/davfs2.conf/usr/share/debconf/debconf.conf/usr/share/doc/apt-utils/examples/apt-ftparchive.conf. . .
Filtrarea în funcție de timp și dimensiune
Find vă oferă o varietate de moduri de a filtra rezultatele în funcție de dimensiune și timp.
Size
Puteți filtra după mărime cu ajutorul parametrului -size
.
Aducem un sufix la sfârșitul valorii noastre care specifică modul în care numărăm. Acestea sunt câteva opțiuni populare:
-
c: bytes
-
k: Kilobytes
-
M: Megabytes
-
G: Gigabytes
-
b: Blocuri de 512 octeți
Pentru a găsi toate fișierele care au exact 50 de octeți, tastați:
- find / -size 50c
Pentru a găsi toate fișierele mai mici de 50 de octeți, putem folosi în schimb această formă:
- find / -size -50c
Pentru a găsi toate fișierele mai mari de 700 de megaocteți, putem folosi această comandă:
- find / -size +700M
Time
Linux stochează date de timp despre timpii de acces, timpii de modificare și timpii de schimbare.
-
Timp de acces: Ultima dată când a fost citit sau scris un fișier.
-
Timp de modificare: Ultima dată când conținutul fișierului a fost modificat.
-
Change Time: Ultima dată când au fost modificate metadatele inode ale fișierului.
Pot fi utilizate împreună cu parametrii -atime
, -mtime
și -ctime
. Aceștia pot folosi simbolurile plus și minus pentru a specifica mai mare decât sau mai mic decât, așa cum am făcut cu mărimea.
Valoarea acestui parametru specifică cu câte zile în urmă doriți să căutați.
Pentru a găsi fișiere care au timpul de modificare cu o zi în urmă, tastați:
- find / -mtime 1
Dacă dorim fișiere care au fost accesate în urmă cu mai puțin de o zi, putem tasta:
- find / -atime -1
Pentru a obține fișiere ale căror informații meta au fost modificate ultima dată cu mai mult de 3 zile în urmă, tastați:
- find / -ctime +3
Există, de asemenea, câțiva parametri de însoțire pe care îi putem folosi pentru a specifica minute în loc de zile:
- find / -mmin -1
Aceasta va da fișierele care au fost modificate de tip sistem în ultimul minut.
Find poate, de asemenea, să facă comparații cu un fișier de referință și să le returneze pe cele care sunt mai noi:
- find / -newer myfile
Cercetarea în funcție de proprietar și permisiuni
Puteți căuta, de asemenea, fișiere în funcție de proprietarul fișierului sau de proprietarul grupului.
Acest lucru se face folosind parametrii -user
și, respectiv, -group
. Găsiți un fișier care este deținut de utilizatorul „syslog” introducând:
- find / -user syslog
În mod similar, putem specifica fișierele deținute de grupul „shadow” tastând:
- find / -group shadow
De asemenea, putem căuta fișiere cu permisiuni specifice.
Dacă dorim să potrivim un set exact de permisiuni, folosim această formă:
- find / -perm 644
Aceasta va potrivi fișiere cu exact permisiunile specificate.
Dacă dorim să specificăm orice cu cel puțin aceste permisiuni, puteți folosi această formă:
- find / -perm -644
Aceasta va potrivi orice fișiere care au permisiuni suplimentare. Un fișier cu permisiuni de „744” ar fi potrivit în acest caz.
Filtrarea în funcție de adâncime
Pentru această secțiune, vom crea o structură de directoare într-un director temporar. Aceasta va conține trei niveluri de directoare, cu zece directoare la primul nivel. Fiecare director (inclusiv directorul temporar) va conține zece fișiere și zece subdirectoare.
Realizați această structură prin emiterea următoarelor comenzi:
- cd
- mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
- touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
- cd ~/test
Nu ezitați să verificați structurile de directoare cu ls
și cd
pentru a vă face o idee despre cum sunt organizate lucrurile. Când ați terminat, reveniți la directorul de test:
- cd ~/test
Vom lucra la modul de returnare a unor fișiere specifice din această structură. Să încercăm mai întâi un exemplu doar cu o căutare obișnuită a numelui, pentru comparație:
- find -name file1
Output./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1./level1dir7/level2dir8/level3dir6/file1./level1dir7/level2dir8/level3dir5/file1./level1dir7/level2dir8/file1. . .
Există o mulțime de rezultate. Dacă introducem ieșirea într-un contor, putem vedea că există un total de 1111 rezultate:
- find -name file1 | wc -l
Output1111
Acestea sunt probabil prea multe rezultate pentru a vă fi utile în majoritatea circumstanțelor. Să încercăm să o restrângem.
Puteți specifica adâncimea maximă a căutării sub directorul de căutare de nivel superior:
- find -maxdepth num -name query
Pentru a găsi „file1” numai în directoarele „level1” și mai sus, puteți specifica o adâncime maximă de 2 (1 pentru directorul de nivel superior și 1 pentru directoarele de nivel1):
- find -maxdepth 2 -name file1
Output./level1dir7/file1./level1dir1/file1./level1dir3/file1./level1dir8/file1./level1dir6/file1./file1./level1dir2/file1./level1dir9/file1./level1dir4/file1./level1dir5/file1./level1dir10/file1
Output./level1dir7/file1./level1dir1/file1./level1dir3/file1./level1dir8/file1./level1dir6/file1./file1./level1dir2/file1./level1dir9/file1./level1dir4/file1./level1dir5/file1./level1dir10/file1
Aceasta este o listă mult mai ușor de gestionat.
Puteți specifica, de asemenea, un director minim dacă știți că toate fișierele există după un anumit punct sub directorul curent:
- find -mindepth num -name query
Puteți folosi acest lucru pentru a găsi numai fișierele de la sfârșitul ramurilor directorului:
- find -mindepth 4 -name file
Output./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1. . .
Din nou, din cauza structurii noastre de directoare ramificate, acest lucru va returna un număr mare de rezultate (1000).
Puteți combina parametrii de profunzime min și max pentru a vă concentra pe un interval îngust:
- find -mindepth 2 -maxdepth 3 -name file
Output./level1dir7/level2dir8/file1./level1dir7/level2dir5/file1./level1dir7/level2dir7/file1./level1dir7/level2dir2/file1./level1dir7/level2dir10/file1./level1dir7/level2dir6/file1./level1dir7/level2dir3/file1./level1dir7/level2dir4/file1./level1dir7/file1. . .
Executarea și combinarea comenzilor de căutare
Puteți executa o comandă ajutătoare arbitrară pe tot ceea ce găsește corespondență folosind parametrul -exec
. Aceasta se numește în felul următor:
- find find_parameters -exec command_and_params {} \;
Cel {}
este folosit ca un spațiu rezervat pentru fișierele cu care find se potrivește. Parametrul \;
este folosit pentru ca find să știe unde se termină comanda.
De exemplu, am putea găsi fișierele din secțiunea anterioară care aveau permisiuni 644
și să le modificăm pentru a avea permisiuni 664
:
- cd ~/test
- find . -type f -perm 644 -exec chmod 664 {} \;
Am putea apoi să modificăm permisiunile directoarelor astfel:
- find . -type d -perm 755 -exec chmod 700 {} \;
Dacă doriți să înlănțuiți diferite rezultate, puteți folosi comenzile -and
sau -or
. Comanda -and
este presupusă dacă este omisă.
- find . -name file1 -or -name file9
Căutarea fișierelor utilizând Locate
O alternativă la utilizarea find
este comanda locate
. Această comandă este adesea mai rapidă și poate căuta cu ușurință în întregul sistem de fișiere.
Puteți instala comanda pe Debian sau Ubuntu cu apt
:
- sudo apt install mlocate
Pe CentOS, utilizați dnf
în schimb:
- sudo dnf install mlocate
Motivul pentru care locate
este mai rapidă decât find
este că se bazează pe o bază de date a fișierelor din sistemul de fișiere.
Baza de date este de obicei actualizată o dată pe zi cu un script cron, dar o puteți actualiza manual tastând:
- sudo updatedb
Executați această comandă acum. Nu uitați, baza de date trebuie să fie întotdeauna actualizată dacă doriți să găsiți fișiere recent achiziționate sau create.
Pentru a găsi fișiere cu locate, utilizați pur și simplu această sintaxă:
- locate query
Puteți filtra ieșirea în câteva moduri.
De exemplu, pentru a returna numai fișierele care conțin interogarea însăși, în loc să returnați fiecare fișier care are interogarea în directoarele care duc la ea, puteți folosi -b
pentru a căuta numai „basename”:
- locate -b query
Pentru ca locate să returneze numai rezultatele care încă există în sistemul de fișiere (care nu au fost eliminate între ultimul apel updatedb
și apelul curent locate
), folosiți steagul -e
:
- locate -e query
Pentru a vedea statisticile despre informațiile pe care locate le-a catalogat, folosiți opțiunea -S
:
- locate -S
OutputDatabase /var/lib/mlocate/mlocate.db:3,315 directories37,228 files1,504,439 bytes in file names594,851 bytes used to store database
Concluzie
Atât find cât și locate sunt modalități bune de a găsi fișiere pe sistemul dumneavoastră. Depinde de dumneavoastră să decideți care dintre aceste instrumente este potrivit în fiecare situație.
Find și locate sunt comenzi puternice care pot fi întărite prin combinarea lor cu alte utilități prin intermediul unor conducte. Experimentați cu filtrarea folosind comenzi precum wc
, sort
și grep
.
.