find je jedan od najkorisnijih Linux/Unix alata, ali vecina ljudi koristi samo delic njegove snage. Mnoga Linux/Unix pitanja koja se vidjaju na netu mogu biti resena koriscenjem samo find komande; u pitanju je samo upoznavanje njenih opcija.
Snaga find komande vam omogucava da uradite stvari pocevsi od pretrage svih vasih .jpg fajlova do trazenja “svih Michael-ovih fajlova koji su izvrsni i koji su juce modifikovani.” U kombinaciji sa xargs, odgovarajuce koriscenje find komande moze uciniti neke od uobicajenih zadataka deset puta laksim.
Pocecemo jednostavno i onda postepeno ici naprednije. Za pocetak pocecemo sa pretragom na osnovu imena. Zapamtite da je prvi argumenat koji dajete find komandi mesto u kojem ce da se izvrsi pretraga.
Pronadji sve fajlove koji sadrze nesto u njihovim imenima:
find . -name "*.jpg"
... ./Pictures/iPhoto Library/Data/2006/Roll 20/00697_bluewaters_1440x900.jpg ./Pictures/iPhoto Library/Data/2006/Roll 20/00705_cloudyday_1440x900.jpg ./Pictures/iPhoto Library/Data/2006/Roll 20/00710_fragile_1600x1200.jpg ./Pictures/iPhoto Library/Data/2006/Roll 20/00713_coolemoticon_1440x900.jpg ./Pictures/iPhoto Library/Data/2006/Roll 20/00714_cloudyday_1440x900.jpg ...
Podrazumevano kada zadate pocetnu lokaciju (u nasem slucaju ”.”), find komanda pocinje tu i onda ide do kraja tokom svoje pretrage. Znaci u ovom slucaju poceo sam od mog home direktorijuma i pronasao stvari do u ”~/Pictures/iPhoto Library/Data/2006/Roll 20”.
[ Stavljanje zagrada oko kriterijuma za pretragu izbegava probleme sa wildcard znakovima i verovatno je dobra navika koju bi ste zeleli da steknete. Mozete koristiti i -iname umesto -name; ista je ali je case insensitive ]
Pronadji sve fajlove koji pripadaju odgovarajucem korisniku:
find . -user daniel
... ./Music/iTunes/iTunes Music/Tool/Undertow/01 Intolerance.m4a ./Music/iTunes/iTunes Music/Tool/Undertow/02 Prison Sex.m4a ./Music/iTunes/iTunes Music/Tool/Undertow/03 Sober.m4a ./Music/iTunes/iTunes Music/Tool/Undertow/04 Bottom.m4a ./Music/iTunes/iTunes Music/Tool/Undertow/05 Crawl Away.m4a ./Music/iTunes/iTunes Music/Tool/Undertow/06 Swamp Song.m4a ./Music/iTunes/iTunes Music/Tool/Undertow/07 Undertow.m4a ./Music/iTunes/iTunes Music/Tool/Undertow/08 4 Degrees.m4a ./Music/iTunes/iTunes Music/Tool/Undertow/09 Flood.m4a ./Music/iTunes/iTunes Music/Tool/Undertow/69 Disgustipated.m4a ...
[ Moze da radi i sa grupama (-group) ]
Pronadji samo direktorijume, regularne fajlove, linkove, ili socket-e:
find . -type d
... ./Development/envelope ./Development/mhp ./Development/mservers ./Development/mservers/fortune100 ./Development/mst ./Development/mst/nmap ./Development/mst/services ...
To su sve direktorijumi, a da bi pretrazili za ostale (fajlovi, linkovi, ili socket-i), samo zamenite f, l, s umesto d u gornjoj komandi.
Pronadji sve fajlove cija je velicina veca od jednog gigabajta
find ~/Movies -size +1024M
... /Movies/Comedy/Funny.mpg /Movies/Drama/Sad.mpg ...
Mozete kombinovati argumente koristeci and, or, i not. Podrazumevano ako koristite dva razlicita argumenta to znaci da stavljate and izmedju njih. Ako zelite da koristite or dodajte -o opciju, a ako zelite da dobijete sve osim necega, koristite ! opciju.
Pronadj samo regularne fajlove, ciji je vlasnik daniel, koji su isto jpg slike
find . -user daniel -type f -name *.jpg
... ./Pictures/iPhoto Library/autumn_woods.jpg ./Pictures/iPhoto Library/blue_forest.jpg ./Pictures/iPhoto Library/brothers.jpg ...
Sada uradi to isto, ali iskljuci sve sto sadrzi ime autumn
find . -user daniel -type f -name *.jpg ! -name autumn*
... ./Pictures/iPhoto Library/blue_forest.jpg ./Pictures/iPhoto Library/brothers.jpg ...
find isto tako poseduje nekoliko opcija koje mogu pomoci da se odgovori na pitanja vezana za forenziku kao npr kada je fajl zadnji put menjan ili nad kojim fajlovima su skoro menjane dozvole.
Nadji sve fajlove u /etc ciji je vlasnik root a koji su bili menjani u toku jucerasnjeg dana
find /etc -user root -mtime -1
... /etc/passwd ...
Opcije za trazenje koje mozete ovde koristiti su:
atime: kada je zadnji put pristupljeno fajlu ctime: kada su zadnji put menjane dozvole nad fajlom mtime: kada su podaci u fajlu zadnji put menjani Pretrage se vrse za periode od 24 sata praceni brojem n. Ako zelite da pronadjete za tacan period od 24 sata koristite samo n. Ipak cesce ce te zeleti recimo, sve od juce, ili sve “vise od 3 dana.” Ovo se postize koriscenjem -n i +n opcija.
Postoje i verzije u minutima za atime, ctime, i mtime argumente:
amin: kad (u minutima) je zadnji put pristupljeno fajlu cmin: kad (u minutima) su zadnji put menjane dozvole nad fajlom mmin: kad (u minutima) su podaci u fajlu zadnji put menjaniPrikazi sve fajlove u /etc ciji je vlasnik root kojima je pristupljeno u zadnje dve minute
find /etc -user root -amin -2
... /etc/hosts /etc/resolv.conf ...
Lista jos nekoliko opcija za firenzicare:
Prikazi sve fajlove u ~ sa svim mogucim dozvolama
find ~ -perm 777
... ~/testfile.txt ~/lab.rtf ...
Ovo je deo kome smo tezili – izvodjenje akcija nad stvarima koje nalazimo sa find. Iako je npr interesantno reci, “Prikazi mi te i te stvari”, mnogo je korisnije reci, “Uzmi svaki tekstualni fajl, ciji je vlasnik Jason, i kojima nije pristupano u zadnjih 60 dana i prebaci ih u backup folder.”
Primeri find komande u akciji iz kuvara [ Testirajte ove na vasem sistmu pre nego ih koristite za neke vazne fajlove ]
Pronadji sve fajlove na sistemu nad kojima svi imaju prava pisanja. Ovo 0002 predstavlja 2 u polju “ostali” u dozvolama fajla, sto je u stvari bit za pisanje
find / -perm -0002
Sakupi sve fajlove ciji vlasnici nisu validni korisnici i izbrisi ih
find / -nouser -print0 | xargs -0 rm
Izbrisite sve slike sa vaseg *nix desktopa
find ~/Desktop -name "*.jpg" -o -name "*.gif" -o -name "*.png" -print0 | xargs -0 mv --target-directory ~/Pictures
[ Opcija -print0 eliminise rezultate sa null znakovima umesto podrazumevane nove linije, cineci izlaz citkijim i koji onda nece smetati kao u vecini slucajeva]
Ispravite dozvole na vasem web direktorijumu
find /your/webdir/ -type d -print0 | xargs -0 chmod 755 find /your/webdir -type f | xargs chmod 644
Prikazi listu fajlova u /etc koji su bili modifikovani od proslog meseca
find /etc -mtime -30
Postoji malo debate u nekim krugovima koji se ticu koriscenja xargs vs. -exec opcije koja je ugradjena u samu find komandu. Za mene tu u stvari i nema prostora za neku debatu; -exec nije ni priblizno dobar kao xargs za ono za sta ja koristim find. Komandu koristim da radi velike poslove ukljucujuci mnogo fajlova. “Premesti sve ove fajlove tamo”, “kopiraj sve te direktorijume tamo”, “Izbrisi ove linkove.”, itd.
Ovde se -exec lomi a xargs ostaje na nogama. Kada koristite -exec pokrecete sposebnu instancu programa kojeg pozivate za svaki unos. Sa xargs, pravite unos u paket i onda ih provlacite kroz pozvanu komandu sto je moguce manje puta, sto je obicno samo jendom. Kada imate posla sa stotinama hiljada elemenata ovo znaci velika pobeda za xargs.
Ne verujete mi? Dobro, hajde da pokrenemo nekolio brojeva. Ispod je izlistavanje 5,310 .jpg fajlova na mojem OS X sistemu koristeci -exec i xargs:
time find . -name "*.jpg" -exec ls {} \;
real 0m23.548s user 0m3.913s sys 0m15.167s
Hmm, to nije lose. 23 sekunde za malo vise od pet hiljada fajlova zar ne? Pokusajmo sada sa xargs.
time find . -name "*.jpg" -print0 | xargs -0 ls
real 0m1.526s user 0m0.667s sys 0m0.864s
To je 2 sekunde vs 24 sekundi. Ozbiljno; find i xargs je kombinacija koji bi ste zeleli da koristite.
Man stranica za find:
http://www.netadmintools.com/html/find.man.html
Man stranica za xargs: