Naredba find

Naredba find je, ako nijedna druga naredba nije, "švicarski nožić" za svakog sistem-inženjera. Svi su je rabili, neki samo za osnovne operacije, a neki i za daleko složenije situacije. Bilo kako bilo, pravo je čudo da joj nismo posvetili više prostora na Portalu za sistemce.

Naredba find ima toliko opcija, da zaista nema smisla opisivati svaku od njih. Zapravo, ima, ali ćemo to napraviti preko primjera. Za detalje konzultirajte sami man ili info stranice, te wiki stranice i blogove. Ukoliko budemo opisivali baš svaku opciju finda, mogli smo jednostavno prevesti cijelu man stranicu.

Krenut ćemo od jednostavnijih primjera (naravno da naredbe ne moraju biti izvršavane kao korisnik root, ali u suprotnom dobivat ćete poruke o greškama "cannot open file" i slično):

# find /home -user marko

- pretražuju se sve datoteke korisnika "marko", i to samo u /home direktoriju. Ukoliko niste korisnik root, dodajte "2>/dev/null" na kraju naredbe, kako ne biste gledali poruke o nemogućnosti otvaranja određenih direktorija ili datoteka.

# find /var/www -name '*.pdf' -printf "%s %p\n"

- pretražuju se sve PDF datoteke u direktoriju /var/www i ispisuju njihove veličine u bajtovima

# find /var/www -name '*.pdf' -exec ls -hs '{}' \;

- slično kao i prethodni primjer, samo u starijoj sintaksi koja će raditi i na drugim Unixima. Možete rabiti i "linuksaški" način, koji daje opet malo drugačiji ispis (koji je ujedno i default, dakle opcija -print je uvijek aktivna):

# find /var/www -name '*.pdf' -print

Opcija -printf je preuzeta direktno iz jezika C, pa imate mnoge mogućnosti ispisa podataka o datotekama. Tako primjerice možete ispisati tip datotečnog sustava na kojem se datoteka nalazi (%F), vrijeme zadnjeg pristupa (%a), vrijeme zadnje promjene datoteke (%t), tip datoteke (%y, %Y) i tako dalje. Općenito, ispis vremena je vrlo konfigurabilan, a možete ispisati i mnoge podatke koje naredba ls standardno ne ispisuje.

Uzmimo par primjera iz CARNetovih paketa:

# find /var/lib/amavis/virusmails -mtime +7 -name "spam-*" -delete

- pretražuje sve datoteke starije od 7 dana (modificirane prije najmanje 7 dana) i  imena koje počinje sa 'spam-' u navedenom direktoriju i briše ih. Ime se mora zaštititi navodnicima kako ljuska (shell) ne bi vršila ekpanziju specijalnih znakova. Umjesto opcije -mtime, možete upotrijebiti -ctime (zadnja promjena statusa, odnosno inodea) i -atime (zadnje vrijeme pristupa).

Za zadnjom opcijom budite oprezni, jer je na mnogim datotečnim sustavima osvježavanje access time atributa (noatime) onemogućen jer usporava rad, i nema uvijek velike koristi.

Ukoliko smo htjeli naći datoteke novije od 7 dana, upotrijebili bismo "-7", a za stare točno 7 dana stavili bismo samo "7". Slična logika se primjenjuje i sa veličinom datoteka.

# find /var/lib/paket -type d -exec chown korisnik:korisnik '{}' \; -exec chmod 2775 '{}' \;

- pretražuje sve direktorije (opcija d) i mijenja vlasništvo u vlasništvo korisnika "korisnik" i grupu korisnik. Time održavatelj paketa vjerojatno popravlja "grijehe" iz prošlosti, kao i osigurava da će njegov paket raditi, čak i ukoliko sistem-inženjer nešto u međuvremenu promijeni. Ovo, inače, nije uobičajena praksa kod paketa, paketi ne bi smjeli upadati jedni drugima u područje. Opcija type prima i druge parametre: "-f" ("obična" datoteka), "-l" (simbolički link), "-p" (socket FIFO - named pipe) itd.

Naredba find se, možda, najčešće rabi kad treba pronaći datoteku određenog korisnika, grupe korisnika, datoteku određenih atributa ili tipa, te ih eventualno promijeniti, obrisati ili slično.

Nadalje, pretraživanje možemo ograničiti na razne načine:

# find /etc -maxdepth 1 -type f -name *.conf"

- pretražuje sve datoteke s nastavkom .conf, ali samo dubine do jednog direktorija, dakle bit će pronađene samo datoteke unutar /etc, ali ne i unutar /etc/apache2.

# find /etc -name pojam -prune

- pretražuje samo datoteke, a ukoliko ime odgovara nekom direktoriju, find neće "sići" dolje u taj direktorij. Ova opcija nije kompatibilna s opcijom -depth, pa se ova opcija ignorira kad se istodobno rabe opcije -depth ili -delete. Opcija -depth označava da se prvo obrađuju podaci u direktoriju, a tek onda sam direktorij. Opcija -delete automatski uključuje opciju -depth.

# find /home \( -name "*.mp3" -o -name ".vfw" \) -print

- pretražuje sve korisničke direktorije u potrazi za datotekama s nastavcima *.mp3 ili *.vfw. Moguće su i složenije konstrukcije:

# find /home \( -name "*.jpg" -a \! -size +1 \) -print

- ovo će ispisati sve datoteke s nastavkom *.jpg i nisu veće od 1 kilobajta.

Umjesto opcije -print , možete rabiti -ls, koja će sve "čudne" (radi se o našim znakovima "ščćđž") znakove ispisati na ovaj način (u stilu jezika C):

# find . -ls
./\271\350\346\360\276
# find . -print
./????

No, to nije sve, postoji i dosta često rabljena opcija -print0, koja umjesto znaka za kraj retka (\n) ispisuje NULL znak (ASCII 000), što efektivno izgleda kao da je sve ispisano u jednom redu, umjesto u više njih. Ovo je idealno za naredbe koje moraju svoje parametre primiti u jednom retku.

Opcija -print0 vrlo često ide uz još jednu zanimljivu naredbu (xargs), jer omogućava da se riješi problem poruke "Argument list too long", ukolko u direktoriju /putanja postoje na tisuće datoteka. Primjerice, naredba:

# rm `find /putanja -type f`

može prouzročiti navedenu poruku, dok oblik:

# find /putanja -type f -print0 | xargs -0 rm

neće imati taj problem, jer listu argumenata razdvaja na manje dijelove i izbjegava probleme s ograničenjima ljuske i drugih limita. Više o naredbi xargs pročitajte na stranici http://sistemac.carnet.hr/node/826.

Voljeli bismo da je to sve što smo imali reći o naredbi find, ali nije. Nažalost, ovom naredbom bismo se mogli baviti kroz cijelu seriju članaka, ali najbolje će biti da iz vlastitih primjera i iskustva naučite još više o findu. U komentaru na članak slobodno pitajte  za neku konstrukciju koja vam nije jasna, pa ćemo pokušati dati odgovor.

Isto tako, slobodno dopišite svoje vlastite zgodne primjere.

Kuharice: 
Kategorije: 
Vote: 
0
No votes yet