- Naredba find omogućuje vam pretraživanje datoteka i direktorija po imenu, vrsti, veličini, datumu, dozvolama, vlasniku i još mnogo čemu.
- Višestruki filteri i logički operatori (I, ILI, NE) mogu se kombinirati za stvaranje vrlo preciznih i učinkovitih pretraga.
- Pomoću opcija -exec i xargs moguće je izravno djelovati na rezultate naredbe find: brisati, kopirati, premještati, komprimirati ili mijenjati dozvole.
- Find se lako integrira s drugim alatima poput grepa, omogućujući pretraživanje sadržaja uz metapodatke.

Ako često radite s GNU/Linux terminalom, prije ili kasnije će vam trebati Dobar alat za pronalaženje datoteka iz naredbenog retkaTu na scenu stupa naredba. naći, jedan od onih starih poznanika UNIX svijeta koji su u početku zastrašujući, ali kad ih se jednom naviknete, postaju neophodni.
s find vam omogućuje pronalaženje datoteka i direktorija u stablu mapa koristeći gotovo sve kriterije koje možete zamisliti: naziv, ekstenziju, veličinu, datume pristupa ili izmjene, dozvole, vlasnika, grupu, vrstu datoteke (normalna, direktorij, simbolička veza…), razinu dubine, pa čak i logičke kombinacije nekoliko uvjeta.
Što je točno naredba find i kako se koristi?
Naredba find je dio klasičnih UNIX uslužnih programa i dostupan je na gotovo svakoj GNU/Linux distribuciji. Za razliku od alata kao što su smjestitiBudući da koriste bazu podataka, find skenira datotečni sustav u stvarnom vremenu, tako da uvijek radi s ažurnim informacijama.
La opća sintaksa pronalaska Obično se piše ovako:
find
U ovoj strukturi, Početna ruta označava gdje počinje pretraga.Mogao bi biti korijen / za cijeli sustav, trenutni direktorij .vaša osobna mapa ~ ili bilo koji apsolutni ili relativni put koji vam je potreban.
Ruta je naznačena u nastavku. opcije filtriranja i izrazi: po imenu, vrsti, veličini, vremenu, dozvolama, vlasniku itd. Ovi uvjeti mogu se kombinirati i popraćeni konačna akcija (na primjer, brisanje, kopiranje, detaljan popis) pomoću parametara kao što su -exec ili integriranje xargs.
Pretraživanje datoteka i direktorija po imenu
Najčešća upotreba funkcije find je za pretraživanje po imenu ili uzorku imena, bilo da se radi o određenoj datoteci ili skupini datoteka koje odgovaraju izrazu.
Za lociranje datoteke s određenim nazivom iz trenutnog direktorija i kroz njegove podmape, dovoljna je naredba poput ove:
find . -name archivo22.txt
Ova naredba Prikazuje sve putanje gdje se pojavljuje datoteka s tim točno tim imenom.Ako želite suziti pretraživanje na drugu mapu, možete upisati, na primjer:
find ./prueba -name archivo22.txt
Također možete koristiti šaljivdžija Za snimanje više datoteka odjednom. Na primjer, za lociranje svih stavki čije ime počinje s "datoteka" u određenom direktoriju:
find ./prueba -name "archivo*"
Ako je ono što vam treba pretraživanje po ekstenzijiKlasični uzorak bi izgledao otprilike ovako:
find . -name "*.txt"
Ovdje govoriš findu da se vrati sve datoteke i direktoriji čije ime završava na .txtPočevši od trenutne lokacije. Za drugi direktorij, jednostavno promijenite početnu putanju:
find /ruta/a/buscar -name "*.html"
Imajte na umu da parametar -ime razlikuje velika i mala slovaAko niste sigurni kako se piše (na primjer, "mojestvari", "MojeStvari", "MOJESTVARI"...) najlakše je upotrijebiti -iname:
find . -iname "mystuff"
s -iname vrši pretragu bez razlikovanja velikih i malih slova, nešto vrlo korisno kada se sjećate samo dijela približnog naziva.
Kontrolirajte vrstu rezultata: samo datoteke, samo direktoriji, poveznice itd.
Prema zadanim postavkama, find može vratiti i obične datoteke i direktorije i druge vrste unosaZa ograničavanje rezultata koristi se opcija -type sa slovom koje označava vrstu datoteke.
Najčešće vrste su f za obične datoteke, d za direktorije y l za simboličke vezeIako ih ima još (znakovi, blokovi, utičnice itd.). Na primjer, za pretraživanje samo datoteka (ne mapa) s određenim nazivom:
find . -type f -name "mystuff"
Ako, naprotiv, ono što želite je pronaći određene direktorijeKoristili biste:
find . -type d -name "qa*"
Također možete kombinirati vrstu datoteke s ekstenzijom. Tipičan primjer: pronalaženje svih C++ kodnih datoteka u vašem projektu:
find . -type f -name "*.cpp"
To je važno stavite uzorak u navodnike Kako biste spriječili da ljuska proširi zvjezdicu prije nego što je `find` obradi. Ako to ne učinite, zamjenski znak će biti zamijenjen imenima prisutnima u trenutnom direktoriju i naredba može prestati raditi kako se očekuje.
Kada želiš pronaći raditi na više direktorija odjednomMožete ih sve navesti na početku naredbe:
find ./location1 /second/location -type f -name "pattern"
Ograniči dubinu pretraživanja i isključi rute
Prema zadanim postavkama, pronađi prolaze rekurzivno pretraži sve podmapePonekad je to previše, na primjer ako vas zanima samo što se nalazi u trenutnom direktoriju. Za kontrolu dubine koristite -maxdepth i, izborno, -mindepth.
Ako želiš Pregledava se samo trenutna razina, a poddirektorije se ne unose., možeš koristiti:
find . -maxdepth 1 -type f -name "*.txt"
Parametar -mindepth Omogućuje vam, na primjer, ignorirajte vlastiti početni direktorij i početi vraćati rezultate s prve unutarnje razine.
Druga uobičajena potreba je Isključivanje određenih direktorija iz pretrageTo se postiže kombiniranjem -path s -prune i operater -o (ILI). Klasičan primjer bio bi:
find . -path "./directory_exclude/*" -prune -o -name "SEARCH_NAME"
ovdje -prune označava da se ne smije spuštati naznačenom rutom, i sa -o Kaže se da se preostali uvjeti procjenjuju samo za ono što nije "orezano". Ovo je vrlo koristan trik za zaobilaženje, na primjer, mapa sigurnosnih kopija, privremenih direktorija ili velikih repozitorija.
Pretraživanje po veličini: velike datoteke, male datoteke i rasponi
Parametar -size dopustiti filtriranje datoteka na temelju njihove veličinePosebno je koristan za otkrivanje ogromnih datoteka koje zauzimaju previše prostora ili za čišćenje nepotrebnih sitnih datoteka.
Osnovni obrazac je:
find -size N
Najčešće jedinice su c (bajtovi), k (KB), M (MB) i G (GB)Broju može prethoditi + (veće od), - (manje od) ili bez prefiksa (točna veličina). Na primjer, za pretraživanje datoteka točno 300 MB:
find . -size 300M
Ako želite ono što želite Pronađite sve što teži više od 300 MB:
find . -size +300M
Za pronalaženje datoteka manjih od 300 MB:
find . -size -300M
Također je moguće definirati raspone veličinaNa primjer, datoteke između 270 i 300 MB:
find . -size +270M -size -300M
Ako vam treba nešto ekstremnije, možete pretražiti, na primjer, datoteke veće od 1 GB ili više od 500 MB na cijelom sustavu:
find / -size +1G
find / -size +500M
I naravno, kombinirajte veličinu s imenomTipičan slučaj: ogromne datoteke zapisnika u korijenskom direktoriju:
find / -size +500M -name "*.log"
Traži prazne datoteke i prazne direktorije
Sustavi se s vremenom pune prazne datoteke i mape koji više nisu korisni. Find nudi opciju -empty da ih se brzo otkrije.
u pronaći sve prazno (datoteke ili direktorije):
find . -empty
Ako vas samo zanima prazne datotekeMožete odrediti vrstu:
find . -type f -empty
A ako je ono što tražite prazni direktoriji:
find . -type d -empty
Nakon što se lociraju, mogu se kombinirati s radnjama za automatski ih izbrišite ako smetaju, nešto što ćemo kasnije vidjeti s -delete y -exec.
Pretrage po datumu: mtime, atime, ctime, minute i rasponi
GNU/Linux zapisi za svaku datoteku tri osnovne vremenske oznake: kada je pristupljeno, kada je njegov sadržaj izmijenjen i kada su se promijenili njegovi metapodaci (dozvole, vlasnik itd.). Find može filtrirati na temelju bilo čega od ovoga.
Najvažniji parametri su:
- -atime / -aminna temelju vremena posljednjeg pristupa (dani ili minute).
- -mtime / -mminna temelju najnovije izmjene sadržaja.
- -ctime / -cminna temelju najnovije promjene stanja (dozvole, vlasnik, veze itd.).
u pronađi datoteke izmijenjene prije više od 7 dana na trenutnoj ruti:
find . -mtime +7
Ako je ono što tražite datoteke kojima je pristupljeno prije manje od 15 dana:
find . -atime -15
Također se možete igrati s vremenski rasponiNa primjer: datoteke čije se stanje promijenilo prije 2 do 6 minuta:
find . -cmin +2 -cmin -6
Kada vam je potrebna preciznija kontrola u roku od nekoliko minuta, ovo dolazi u obzir -mmin, -amin i -cminNa primjer, datoteke čiji je sadržaj izmijenjen u posljednjih 5 minuta:
find . -type f -mmin -5
Ili Java datoteke modificirane prije 20 do 30 minuta, kombinirajući naziv i raspon:
find . -type f -mmin +20 -mmin -30 -name "*.java"
Još jedna zanimljiva opcija je -novije, što omogućuje usporedi datume između datotekaNa primjer, za dobivanje svih najnovijih datoteka iz dane referentne datoteke:
find / -newer mi_archivo
Filtriraj po vlasniku, grupi i datotekama bez roditelja
U višekorisničkim sustavima ili poslužiteljima vrlo je korisno moći locirajte datoteke prema njihovom vlasniku ili grupiNa primjer, za provjeru sadržaja svakog računa ili za otkrivanje čudnih stvari.
Za pronalazak svih datoteka koje pripadaju korisniku "juan" u trenutnom direktoriju:
find . -type f -user juan
Ako vas zanima samo, recimo, određene vrste datotekaMožete dodati naziv uvjeta:
find . -type f -user juan -name "*.cpp"
S opcijom -group Isto radite, ali po grupama. Na primjer, datoteke iz grupe „flossblog”:
find . -group flossblog -type f
Pronađite i podršku Rasponi UID-ova i GID-ova pomoću -uid i -gidOvo vam omogućuje numeričko lociranje datoteka koje pripadaju skupu korisnika. Na primjer, datoteke korisnika čiji je UID između 500 i 1000 (isključujući ekstremne vrijednosti):
find . -uid +500 -uid -1000 -type f
Osim toga, postoje i filteri. -nouser i -nogrupavrlo korisno za otkriti osirotele datotekeTo jest, ne pripadaju nijednom valjanom korisniku ili grupi u sustavu:
find . -nouser
find . -nogroup
Pretraživanje po dozvolama i načinima pristupa
Parametar -perm dopustiti pronađi datoteke na temelju njihovih dozvolatočno ili na temelju određenih dijelova. Postoje i prečaci poput -readable, -writable y -executable filtrirati prema tome što vaš trenutni korisnik može učiniti.
Locirati sve datoteke koje trenutni korisnik može čitati:
find . -readable
Ako želite znati što Možete mijenjati datoteke:
find . -writable
I za one koji Izvršni su za vas:
find . -executable
Kada trebate raditi s numerički načini rada kao što su 644, 755, 777 itd.Sintaksa je:
find . -perm 777
U ovom slučaju, traže se datoteke čiji način točno odgovara 777, Međutim, -perm Prihvaća prefikse koji mijenjaju ponašanje:
- Bez prefiksa: podudara se samo ako je način točno onakav kakav je naznačen.
- s - ispred: datoteka On barem ima te dozvole (može ih imati i više).
- s / naprijed: podudara se ako bilo koji od bitova PMODE je prisutan.
Na primjer, za lociranje Sve datoteke čiji vlasnik i grupa imaju pristup za čitanje i pisanje, a ostale imaju pristup za čitanje, u točnim riječima:
find . -perm 664
Ako dodate prefiks -Datoteke kao što su 666, 777 i 776 također će biti generirane, pod uvjetom da sadržavati najmanje 664 bita:
find . -perm -664
S druge strane, gledajući s /222 dobit ćete datoteke koje netko može napisati (vlasnik, grupa ili drugi):
find . -perm /222
Optimizacija performansi: opcije -O1, -O2 i -O3
U sustavima sa ogromna stabla direktorijaUčinkovitost `find`-a može napraviti veliku razliku. GNU `findutils` pruža razine optimizacije kroz opcije -O1, -O2 y -O3.
s -O1 Koristi se zadana konfiguracija, s davanjem prioriteta testovi naziva datoteka u usporedbi s drugima koji troše više resursa. Na primjer:
find -O1 /ruta -name "*.html"
Izbor -O2 omogućuje pronalaženje interno sortiraj testove po imenu i vrsti datoteke prije ostalih, dodatno optimizirajući rutu:
find -O2 /ruta -type f -name "*.html"
konačno, -O3 neka se samo pronađe preurediti filtere na temelju vjerojatnosti uspjeha i troškovatraženje maksimalne ukupne učinkovitosti:
find -O3 /ruta -name "*.html"
Kombinirajte uvjete: I, ILI, NE i regularne izraze
Jedna od velikih prednosti pronalaska je ta što omogućuje kombiniranje više logičkih uvjetaZapravo, interno funkcionira s vrstom jezika izražavanja koji možete sastaviti.
Kombinirati uvjete s I može se koristiti eksplicitno -and ili jednostavno ostavite razmak između uvjeta (I je zadano ponašanje). Na primjer, datoteke između 500 MB i 1 GB:
find /ruta -size +500M -and -size -1G
s -Ili (ili skraćeno) -oMožete pretraživati datoteke koje ispunjavaju zahtjeve. barem jedan od nekoliko uvjetaNa primjer, DOCX ili ODT dokumenti:
find /ruta -name "*.docx" -or -name "*.odt"
Ukoliko želite isključiti nešto, imaš -ne ili simbol ! (obično s obrnutom kosom crtom na početku kako ga ljuska ne bi interpretirala). Na primjer, .docx datoteke koje nisu .odt:
find /ruta -name "*.docx" -not -name "*.odt"
Pronađite i podršku potpuni regularni izrazi pomoću -regex y -regextypeTo omogućuje konstrukciju vrlo finih filtera, kao što su direktoriji projekata koji nisu kopije, niti stare verzije, niti imaju određene sufikseMalo složeniji uzorak mogao bi biti:
PATTERN=".*/((.*(|old|ba?c?ku?ps?))|(..*)|(copy|new|backup|back|).*)$"
find proyectos -maxdepth 1 -mindepth 1 -regextype posix-egrep ! -iregex "$PATTERN" ! -empty -type d
Koristite find zajedno s grep za pretraživanje po sadržaju
Iako je find nevjerojatno fleksibilan, Ne analizira sam sadržaj datoteka.Fokusira se na imena i metapodatke. Za pretraživanje teksta unutar datoteka obično se kombinira s grep.
Tipičan način za to je putem -exec:
find /ruta -type f -exec grep -i "palabra" {} \; -print
Ovdje pronađite proslijedi svaku pronađenu datoteku grepu, koji traži naznačeni tekst (ignorirajući velika i mala slova s -iOpcija -print To uzrokuje prikaz putanja datoteka koje sadrže taj uzorak.
Ako želite da bude učinkovitije, možete integrirati xargs u Linuxu grupiranje datoteka u grupe umjesto pokretanja grep-a jednom za svaku datoteku:
Drugi vrlo čest obrazac uključuje lociranje PHP datoteke, konfiguracijske datoteke ili druge specifične datoteke i pretražite unutar određenog teksta, kao što je token, URL ili naziv funkcije. Na primjer:
find proyectos -name "*.php" -type f -print0 | xargs -0 grep -l "ireg"
Djelujte na temelju rezultata: -exec, xargs i -delete
Do sada smo se usredotočili na to kako locirati datotekeAli prava magija dolazi kada koristite find za poduzmite mjere na temelju tih rezultataKljučni alati za to su -exec, xargs i mogućnost -delete.
Koristite -exec za pokretanje naredbi na svakoj datoteci
Generički oblik i primjeri napredno korištenje -exec-a To je:
find -exec comando {} +
Tipke {} ponašaju se poput oznaka položaja koji se zamjenjuje pronađenim datotekama i + To označava da se u svakom izvršavanju naredbe treba proslijediti što više datoteka (što je obično učinkovitije).
Na primjer, napraviti dugi popis (ls -l) svih .txt datoteka pronađeno:
find . -type f -name "*.txt" -exec ls -l {} +
Druga često korištena varijanta je završiti -exec s \; umjesto da +, što čini to Naredba se izvršava jednom po datoteci:
find . -type f -name "*.txt" -exec ls -l {} \;
Ovo je manje učinkovito, ali ima prednost što možete koristite {} više puta istim redoslijedom. Na primjer, za Preimenuj sve .txt datoteke dodavanjem ekstenzije .old:
find . -type f -name "*.txt" -exec mv {} {}.old \;
Koristite xargs s findom
Mnogi korisnici se osjećaju ugodnije s klasična lulaTu dolazi do izražaja xargs, koji prikuplja retke sa standardnog ulaza i prosljeđuje ih kao argumente naredbi.
Jednostavan primjer: Detaljan popis svih .txt datoteka na grupirani način:
find . -type f -name "*.txt" | xargs ls -l
Kada postoji rizik od putanje s razmacima ili posebnim znakovimaToplo se preporučuje korištenje -print0 u pronalasku i -0 u xargs, kao u prethodnom primjeru s grep-om.
Pretraživanje i promjena dozvola odjednom
Ponavljajući zadatak je prilagoditi dozvole za više datoteka odjednomNa primjer, postavljanje svih .php datoteka u projektu na 755:
find ver -name "*.php" -type f -exec chmod 755 {} \;
Također je moguće prvo filtriraj prema trenutnim dozvolama a zatim ih modificirajte. Na primjer, pronađite datoteke s 644-bitnim načinom rada i pretvorite ih u 655-bitne:
find . -type f -perm 644 -exec chmod 655 {} \;
U slučaju direktorija, možete pronaći one s dozvolama 644 i promijeniti ih na 755 kako biste ih učinili izvršnima (dostupnima):
find . -type d -perm 644 -exec chmod 755 {} \;
Kopiranje i premještanje pronađenih datoteka pomoću funkcije find
Druga tipična upotreba je kopiranje ili premještanje datoteka koje zadovoljavaju određene kriterije na druge lokacije, bilo radi sigurnosne kopije, reorganizacije ili arhiviranja.
Npr. kopirati određenu datoteku u direktorij od sudbine:
find . -iname "archivo22.txt" -exec cp {} ~/tmp/imagenes \;
O kopiraj sve .jpg slike pronađeno u istom direktoriju slika:
find . -iname "*.jpg" -exec cp {} ~/tmp/images \;
Također možete pregledavati popis odredišnih direktorija i kopiraj zadanu datoteku na sve njih:
find ~/tmp/dir1/ ~/tmp/dir2/ $HOME/3/ -maxdepth 0 -exec cp ~/numeric/hci {} \;
u premjestiti datoteke Umjesto da ih kopirate, jednostavno ih zamijenite cp od mvNa primjer, premještanje određene datoteke:
find ~/folder/ -type f -name "universal.php" -exec mv {} ~/numeric/ \;
Ili se preseliti sve .php datoteke s jedne web-lokacije na drugu:
find ~/numeric/ -type f -name "*.php" -exec mv {} ~/folder/ \;
Možete čak premjestiti po uzorku imenaNa primjer, sve datoteke čije ime počinje s "uni" bez obzira na ekstenziju:
find . -type f -name "uni*.*" -exec mv {} ~/unifiles/ \;
Ako kombinirate s filtri za dobJednostavno je postaviti zadatke arhiviranja. Na primjer, premještanje svih PDF-ova starijih od 20 dana u mapu sigurnosnih kopija:
find /ruta/ -type f -name "*.pdf" -mtime +20 -exec mv {} /backup1/ \;
Izbrišite datoteke i direktorije s naredbom find (pažljivo)
Find se također puno koristi za skupno brisanje datoteka i mapaNevjerojatno je moćan, ali morate s njim rukovati s velikim oprezom, posebno ako ga pokrećete kao root.
Najizravniji način brisanja samo datoteke koji slijede obrazac je nešto poput:
find . -type f -name "til*" -exec rm {} \;
u brisanje samo direktorija koje počinju s do:
find . -type d -name "til*" -exec rm -rf {} \;
Ako želite izbrisati i datoteke i mape koji odgovaraju uzorku:
find . -name "til*" -exec rm -rf {} \;
Vrlo čest slučaj je izbrisati sve datoteke određene ekstenzije u stablu direktorija, na primjer sve .txt:
find . -type f -name "*.txt" -exec rm -f {} \;
Ako vam je to draže Bit ćete upitani za potvrdu za svaku datoteku, možete dodati -i rm:
find . -type f -name "*.txt" -exec rm -i {} \;
Drugi prikladan i donekle sigurniji način je korištenje -izbrisati, koji direktno briše ono što zadovoljava uvjete find-a, bez prolaska kroz rm:
find . -type f -size 0 -delete
U slučaju prazni direktorijimožete koristiti rmdir ili također -delete:
find . -type d -empty -exec rmdir {} \;
find . -type d -empty -delete
Kao opće pravilo, prilikom korištenja funkcije find za brisanje važnih stvari, preporučljivo je Prvo pokušajte naredbu bez dijela za brisanje (koristeći samo filtere) i pregledajte popis pogođenih datoteka. Nakon što ste jasni oko toga koje želite izbrisati, dodajte destruktivnu radnju.
Kombinirajte pronalaženje s kompresijom, sigurnosnim kopijama i drugim zadacima
Zahvaljujući fleksibilnosti od -exec, find se besprijekorno integrira s alati za kompresiju i sigurnosno kopiranje kao tar, gzip o rsyncNa primjer, uobičajeno je pronaći stare i velike datoteke zatim ih komprimirajte ili arhivirajte.
Tipičan tijek rada može biti: pronaći datoteke starije od 30 dana i veće od 1 MB, komprimirati ih, a zatim ih izbrisati ako više nisu potrebne. Nakon toga možete dizajnirati skripte koje se pokreću s crontab za automatsko čišćenje i izradu sigurnosnih kopija.
Također je vrlo korisno kombinirati find s katran stvoriti inkrementalne sigurnosne kopije nedavno izmijenjenih datotekaili generirati popise datoteka koje se zatim prosljeđuju drugim alatima za izvještavanje, sinkronizaciju ili validaciju.
Ukratko, naredba find je ključni alat u svakodnevnom radu sistemskih administratora i programerabudući da im omogućuje ne samo lociranje bilo koje datoteke na GNU/Linux sustavu, već i djelovanje na nju s kirurškom preciznošću, kombinirajući više kriterija filtriranja, integrirajući je s alatima kao što su grep, tar, xargs ili rm te automatizirajući sve vrste rutinskih zadataka bez potrebe za grafičkim sučeljima ili beskrajnim ručnim pretraživanjem.
Strastveni pisac o svijetu bajtova i tehnologije općenito. Volim dijeliti svoje znanje pisanjem, a to je ono što ću učiniti na ovom blogu, pokazati vam sve najzanimljivije stvari o gadgetima, softveru, hardveru, tehnološkim trendovima i još mnogo toga. Moj cilj je pomoći vam da se snađete u digitalnom svijetu na jednostavan i zabavan način.