Cum folosești comanda Find în Linux?

linux

Comanda find este unul dintre cele mai ciudate programe Linux pe care le vei folosi.

Este suficient de esențială pentru a fi omniprezentă, dar suficient de obscură pentru a nu fi favorita nimănui.

Există alternative precum fd, dar find este un program cu cel mai mic numitor comun care funcționează, practic.

În cel mai simplu caz, utilizarea comenzii find este floare la ureche:

find . -name '*.txt'

Acest tip comun de interogare găsește toate fișierele din directorul curent sau din orice director sub acesta care se termină cu „.txt”. Dacă ați ajuns până aici, probabil că nu știți cât de complexă devine funcția find.

Pagina sa de manual are 1.639 de linii (versiunea 4.9.0) și, odată ce explorați funcționalitatea find, începe să pară mai puțin un utilitar util și mai mult un limbaj de programare complet dezvoltat.

Această complexitate m-a descurajat întotdeauna în trecut. Mi-am dorit mult timp o modalitate simplă de a găsi fișierele pe care le-am editat recent, dar întotdeauna mi-a scăpat. Rezultatele ajung să fie pline de fișiere .git sau o harababură nesortată. Așa că am decis să mă așez și să mă familiarizez în sfârșit cu find; rezultatul a fost revigorant.

Utilizarea de bază a funcției find arată astfel:

find [starting-point...] [expression]

Funcția Find urmează acești pași pentru a-și îndeplini sarcina:

Procesează fiecare fișier și director din punctul de pornire; sunt acceptate mai multe puncte de pornire.
Aplică teste; dacă fișierul le trece pe toate, ia măsuri.
Acțiune: acțiunea implicită este -print, care afișează numele complet al fișierului.

O simplă comandă de căutare, fără argumente, listează tot ce se află sub directorul curent.

Acest lucru poate fi destul de util de unul singur, dar adevărata putere a funcției Find vine odată cu parametrii pe care îi suportă.

Raportarea fișierelor modificate recent de către funcția Find

Când lucrezi la o sarcină mai complexă ca aceasta, este o idee bună să planifici ce ai nevoie, apoi să descoperi cum să realizezi acest lucru pas cu pas. Pentru comportamentul pe care îl urmăresc, știu că am nevoie de:

  • Fișiere care îmi aparțin.
  • Fișiere care nu se află în directoare ascunse.
  • Rezultate sortate după dată, cu datele afișate.

Pentru asta va trebui să instalați pachetul eza folosind comanda:

sudo apt install eza

Apoi puteți executa comanda:

eza --tree --long --all

Găsiți fișierele deținute de un utilizator

Comanda este simplă, adăugarea parametrului -user la comanda find, care afișează un fișier doar dacă utilizatorul curent îl deține:

find . -user "${USER}"

Notă!

USER este o variabilă de mediu care conține numele de utilizator al utilizatorului curent.

Pentru a vă asigura că lista finală conține doar fișiere, utilizați parametrul -type din comanda find.

Acesta necesită un singur caracter pentru a indica tipul de fișier care se potrivește, printre care se află:

  • f pentru un fișier obișnuit
  • d pentru un director
  • l pentru o legătură simbolică
find . -user "${USER}" -type f

Comanda de mai sus va arăta toate fișierele (nu directoarele) deținute de utilizatorul curent.

Găsiți fișiere care nu se află în directoare ascunse

Pentru a opri comanda find să nu afișeze fișierele din directoarele ascunse folosind parametrul -prune:

find . -path "*/.*/*" -prune

Comanda de mai sus face următoarele:

  • parametrul -path afișează toate fișierele (inclusiv directoarele) cu o cale care include cel puțin un director ascuns
  • parametrul -prune împiedică accesul comenzii find în acele directoare
  • întrucât nu există niciun alt parametru în afară de -prune, find aplică parametrul -print în mod implicit

Astfel comanda echivalentă este:

find . -path "*/.*/*" -prune -print

În loc să afișezi directoarele ascunse care sunt eliminate, poți afișa tot restul folosind parametrul -o:

find . -path "*/.*/*" -prune -o -print

Parametrul -o este un SAU logic, ceea ce înseamnă că funcția find se va potrivi fie cu expresia anterioară, fie cu cea următoare.

Deci, dacă o cale are un director ascuns, aceasta va fi eliminată; altfel, va fi afișată.

În acest moment, puteți integra expresia originală filtrată după proprietar și tipul de fișier:

find . -path "*/.*/*" -prune -o -user "${USER}" -type f -print

Această comandă find localizează toate fișierele necesare și nimic mai mult.

Ceea ce rămâne este să le sortăm după cea mai recentă modificare și să afișăm data respectivă lângă fiecare fișier.

Notă!

Puteți folosi parametrul -path pentru a obține aceleași rezultate, cu o comandă puțin mai scurtă:

find . -type f -not -path '*/.*/*' -user "${USER}"

Dacă încercați asta, veți obține aceleași rezultate ca și versiunea care folosește -prune.

Diferența este că -prune este mai eficient deoarece va evita testarea fișierelor din directoarele ascunse. Dacă lucrați cu multe directoare, ar trebui să utilizați întotdeauna -prune pentru a sări peste orice puteți evita.

Sortarea și afișarea rezultatelor

Comanda find nu gestionează sortarea în sine; pentru această sarcină, puteți utiliza sort, una dintre comenzile esențiale de procesare a textului.

Mai întâi, însă, veți avea nevoie de data modificată pentru fiecare fișier.

Parametrul -printf îi spune funcției find exact cum doriți să fie rezultatul:

find . -path "*/.*/*" -prune -o -user "${USER}" -type f -printf "%TY-%Tm-%Td %p\n"

Parametrul -printf va folosi conținutul șirului între ghilimele pentru a formata informațiile fișierului.

În acest exemplu, %TY se referă la anul ultimei modificări.

%Tm și %Td reprezintă luna și respectiv ziua, în timp ce %p este numele fișierului.

Puteți specifica o dată mai detaliată pentru o sortare mai precisă, dar eu sunt interesat doar de date, așa că pasul final este să ordonez prin sortare.

Rețineți că ordonez fiecare linie mai întâi cu data.

Acest lucru are două scopuri: menține totul aliniat frumos, dar face și sortarea o sarcină banală.

find . -path "*/.*/*" -prune -o -user "${USER}" -type f -printf "%TY-%Tm-%Td %p\n" | sort

Comentarii

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Acest site folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.