Cum să folosiți Find și Locate pentru a căuta fișiere pe Linux

author
10 minutes, 4 seconds Read

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
Output
1111

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
Output
Database /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.

.

Similar Posts

Lasă un răspuns

Adresa ta de email nu va fi publicată.