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.

Osnove

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
...

Kombinacija argumenata

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
...

Forenzika

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 menjani

Prikazi 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:

  • -nouser: daje izlaz koji nije povezan sa postojecim userid
  • -nogroup: prikazuje izlaz koji nije povezan sa postojecim groupid
  • -links n: fajl sadrzi n linkova
  • -newer file: fajl je modifikovan u skorije vreme u odnosu na file.
  • -perm mode: fajl ima mode dozvole.

Prikazi sve fajlove u ~ sa svim mogucim dozvolama

find ~ -perm 777
...
~/testfile.txt
~/lab.rtf
...

Kombinovanje find sa ''xargs''

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

Na kraju

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.

Reference

 
koriscenje_find_komande.txt · Last modified: 2007/07/18 13:03 by soxxx
 
Recent changes RSS feed Creative Commons License Valid XHTML 1.0 Valid CSS Driven by DokuWiki