Komanda find (juniks)

S Vikipedije, slobodne enciklopedije
find
Originalni autor(i)Dick Haight
Programer(i)Belove laboratorije
Operativni sistemJuniks
TipNaredba (programiranje)

U operativnim sistemima sličnim Juniksu, komanda find je komanda koja se koristi u komandnoj liniji (terminalu) i njom se pretražuje jedna ili više grana fajl sistema. Lociranje fajlova vrši prema kriterijumu korisnika. Ovom naredbom se mogu mogu izvršiti i neke zadate korisničke akcije nad fajlovima koji ispunjavaju zadati kriterijum. Neki od mogućih kriterijuma jesu poklapanje po nekom datom šablonu, ili vremensko poklapanje po vremenu posednje promene, ili poslednjeg pristupa. Standardno, ukoliko se na zada drugačije, komanda find vraća listu fajlova ispod trenutne grane radnog direktorijuma.

Srodna naredba locate koristi bazu podataka i indeksiranje fajlova dobijenih naredbom find (osvežavanje regularnih intervala, tipični cron posao) kako bi dobili brži metod pretrage celog fajl sistema ili fajla po imenu.

Istorija[uredi | uredi izvor]

Naredba find uvedena je u Version 5 Unix kao deo projekta Programmer's Workbench, a napisana je od strane Dika Hajta zajedno sa cpio.[1] Ove dve naredbe su pravljene da se koriste zajedno.[2]

Sintaksa[uredi | uredi izvor]

$ find [-H] [-L] [-P] path... [expression]

Tri opcije kontrolišu kako će komanda find tretirati simboličke linkove. Standarno ponašanje jeste da se nikada ne prate simbolički linkovi. Ovo se može specifično zadati zastavicom —P. —L zastavica da komanda find prati simbolički link. Zastavica —H se koristi kako bi se pratio simbolički link dok se prosesuiraju argumenti komandne linije. Sa starinijm verzijama ove zastavice nisu dostupne.

Barem jedna putanja mora postojati u izrazu. Nareba find može da obradi specijalne znakove pa se mora strogo voditi raluna sa izradom ovih komandi kako bi se kontolisao shell globbing.

Elementi u izrazu su odvojeni praznim mestima, a posmatraju se sa leve na desnu stranu. Mogu sadržati logičke elemente kao što su AND i OR, kao i mnogo kompleksnije izraze. GNU naredba find ima jako mnogo dodatnih opcija koje nisu navedene u POSIX standardu.

POSIX zaštita od neograničenog (beskonačnog) izlaza[uredi | uredi izvor]

Naredba find detektuje beskonačne petlje, kao što je ulazak u već posećen direktorijum. Kada se detektuje ulazak u beskonačnu petlju, komanda find vraća dijagnostikovanu poruku na standardni izlaz i/ili se vrati na svoju početnu poziciju.

Operatori[uredi | uredi izvor]

Operatori se mogu koristiti radi poboljšanja komande find. Komande su navedene u opadajućem poretku po korisnosti:

  • (expr) — tačno ako je izraz expr tačan;
  • ! expr — tačno ako je izraz expr netačan;
  • expr1 expr2 (or expr1 -a expr2) — AND. expr2 nije izračunljivo ako je expr1 netačno;
  • expr1 -o expr2 — OR. expr2 nije izračunljiv ako je expr1 tačno
$ find . -name 'fileA_*' -o -name 'fileB_*'

Pretražuje trenutni direktorijum tražeći fajl čije ime počinje sa fileA_ ili fileB_ .

$ find . -name 'foo.cpp' '!' -path '.svn'

Pretražuje se trenutni direktorijum izuzev poddirektorijuma „.svn” za fajlovima čije je ime „foo.cpp”. Znak uzvija se stavlja pod znake navoda kako ga šel ne bi interpretirao kao karakter zamene.

Pojašnjenje type filter-a[uredi | uredi izvor]

Veliki broj filtera je podržano od strane komande find. Aktiviraju se koristeći konfiguracioni prekidač:

$ find -type x

gde x može biti:


Konfiguracioni prekidači koji su navedeni tamnim podebljanim slovima su najčešće u upotrebi.

Primeri[uredi | uredi izvor]

Od trenutnog direktorijuma[uredi | uredi izvor]

$ find . -name 'my*'

Ova komanda pretražuje fajlove iѕ trenutnog direktorijuma čija imena počinju sa my.

Samo regularni fajlovi[uredi | uredi izvor]

$ find . -name 'my*' -type f

Ovo ograničava rezultate pretrage samo na regularne fajlove, stoga isključuje direktorijume, specijalne fajlove, simbločke linkove itd. my* je pod polunavodnicima jer bi u suprotnom ljuska to zamenila sa listom fajlova iѕ trenutnog diretorijuma čije ime počinje sa my

Komande[uredi | uredi izvor]

Prethodni primeri kreirali su liste rezultata zato što komanda find podraѕumevano iѕvršava i radnju -print.(Imajte na umu da raije verzije komande find nisu imale ovu podrazumevanu radnju; rezultujuća lista bila bi odbačena što bi zbunjivalo korisnike.)

$ find . -name 'my*' -type f -ls

Ovo štampa informacije o proširenim fajlovima.This prints extended file information.

Pretraga svih direktorijuma[uredi | uredi izvor]

$ find / -name myfile -type f -print

Ovo pretražuje regularne fajlove čije ime je myfile i štampa to na ekranu. Pretraga fajlova na ovaj način obično nije dobra ideja. Ovo može oduѕeti dosta vremena, tako da je najbolje preciѕnije odrediti direktorijum. Neki operativni sitemi mogu da povežu sisteme dinamičkih fajlove koji nisu usklađeni sa komandom find. Složenije nazive fajlova uključujući posebne znakove možda će biti potrebno staviti pod navodnike.

Pretraga svih direktorijuma sem jedne grane poddirektorijuma[uredi | uredi izvor]

$ find / -path excluded_path -prune -o -type f -name myfile -print

Ovo pretražuje svaki direktorijum sem grane poddirektorijuma excluded_path koja je skraćena radnjom -prune za regularan fajl čije iem je myfile.

Zadati direktorijum[uredi | uredi izvor]

$ find /home/weedly -name myfile -type f -print

Ovo pretražuje regularne fajlove sa imenom myfile po /home/weedlydirektorijumu. Treba uvek navesti direktorijum preciѕnije do najdaljeg nivoa.

Više direktorijuma[uredi | uredi izvor]

$ find local /tmp -name mydir -type d -print

Ovo pretražuje direktorijume sa imenom mydir u local poddirektorijumu trenutnog direktorijuma i /tmp direktorijumu.

Ignorisanje grešaka[uredi | uredi izvor]

Ako ovo radite kao korisnik koji nije root, možda ćete želeti da ignorišete greške u kojima su odbijene doѕvole ( i neke druge). Pošto se greške štampaju na stderr, one mogu biti izostavljene preusmeravanjem iѕlaѕa do /dev/null. Sledeći primer pokaѕuje kako da uradimo ovo u baš ljusci:

$ find / -name myfile -type f -print 2> /dev/null

Ako ste csh ili tcsh korisnik, ne možete preusmeriti stderr bez preusmeravanja stdout. Možete koristiti sh da iѕvršite komandu find da biste ѕaobišli ovo:

$ sh -c "find / -name myfile -type f -print 2> /dev/null"

Alternativna metoda kada koristite csh or tcsh je da povežemo izlaz iz stdout i stderr u grep komandu. Ovaj primer pokaѕuje kako se izostavljaju linije koje sadrže greške u kojima je odbijena dozvola.

$ find . -name myfile |& grep -v 'Permission denied'

Pretraga fajlova sa različitim imenima[uredi | uredi izvor]

$ find . \( -name '*jsp' -o -name '*java' \) -type f -ls

Operator -ls štampa proširenu informaciju, a ovaj primer traži bilo koji regularan fajl čije ime se završava ili sa 'jsp' ili sa 'java'. Primetite da su ѕagrade neophodne. U mnogim ljuskama sa zagradama se koriste i kose crte kako bi se sprečilo da se zagrade tumače kao posebni znakovi ljuske. Operator -ls nije dostupan kod svih verѕija komande.

Izvršavanje radnje[uredi | uredi izvor]

$ find /var/ftp/mp3 -name '*.mp3' -type f -exec chmod 644 {} \;

Ova komanda menja dozvole svih regularnih fajlova čija imena se završavaju sa .mp3 u direktorijumu /var/ftp/mp3. Radnja se izvodi preciznim definisanjem iskaza -exec chmod 644 {} \; u komandi. Za svaki regularan fajl čije ime se završava sa .mp3, komanda chmod 644 {} je izvršena zamenom {} sa imenom fajla. Tačka-zarez (kosu crtu koristimo da bi sprečili da ljuska to prikaže kao razdvajač naredbi) označava kraj naredbe. Dozvola 644, obično prikazana kao rw-r--r--, daje vlasniku fajla dozvolu za čitanje i pisanje fajla, dok drugi korisnici imaju samo dozvolu za čitanje. U nekim ljuskama, {} moraju biti pod navodnicima. Tačka-zarez ";" je obično navedena sa "\", ali bi isto tako efektivno mogla da bude označena polunavodnicima.

Komanda ne bi trebala da bude citirana; u suprotnom dobijamo poruku da postoji greška

find: echo "mv ./3bfn rel071204": No such file or directory

što znači da komanda find pokušava da izvrši fajl pod nazivom 'echo "mv ./3bfn rel071204"' i ne uspeva.

Ako ćete izvršavati više rezultata, efikasnije je koristiti varijantu primarnog izvršavanja koja sakuplja imena fajlova do ARG_MAX a onda izvršava COMMAND sa listom imena fajlova.

$ find . -exec COMMAND {} +

Ovo će osigurati da imena fajlova sa razmacima budu prosleđena ka COMMAND tako da ih ljuska ne podeli.

Brisanje fajlova i direktorijuma[uredi | uredi izvor]

Radnja -delete je GNU nastavak, i korišćenjem toga uključujemo -depth. Ako testiramo find komandu sa -print umesto sa -delete da bi shvatili šta se dešava potrebno je da koristimo -depth -print.

Brisanje praznih fajlova i štampanje imena (primetite da je -empty jedinstveno proširenje iz GNU find komande koja nije dostupna u svim primenama find komande):

$ find . -empty -delete -print

Brisanje praznih ragularnih fajlova:

$ find . -type f -empty -delete

Brisanje praznih direktorijuma:

$ find . -type d -empty –delete

Brisanje praznih fajlova sa imenom 'bad':

$ find . -name bad -empty –delete

Upozorenje. - Radnja -delete bi trebala biti korišćena sa uslovima kao što su -empty ili -name: Warning. — The -delete action should be used with conditions such as -empty or -name:

$ find . -delete # this deletes all in .

Pretraga niske[uredi | uredi izvor]

Ova komanda će tražiti nisku po svim fajlovima /tmp direktorijuma:

$ find /tmp -type f -exec grep 'search string' /dev/null '{}' \+

Argument /dev/null je korišćen da prikaže ime fajla pre pronađenog teksta. Bez toga, samo pronađeni tekst je štampan. GNU grep može biti korišćen sam da izvršava ovaj zadatak:

$ grep -r 'search string' /tmp

Primer pretrage niske "LOG" u jsmith-ovom home direktorijumu:

$ find ~jsmith -exec grep LOG '{}' /dev/null \; -print
/home/jsmith/scripts/errpt.sh:cp $LOG $FIXEDLOGNAME
/home/jsmith/scripts/errpt.sh:cat $LOG
/home/jsmith/scripts/title:USER=$LOGNAME

Primer pretrage za niskom "ERROR" u svim XML fajlovima u trenutnom direktorijumu:

$ find . -name "*.xml" -exec grep "ERROR" /dev/null '{}' \+

Stavljanje niski pod navodnike (" ") i polunavodnike (' ') je neobavezno u ovom primeru ali oni su tu da obezbede razmake i druge posebne znakove u niski. Primetite da su kod složenijih tekstova (posebno u većini popularnih ljuski koje potiču iz `sh` i `csh`) polunavodnici često lakši izbor jer navodnici ne sprečavaju sva posebna tumačenja. Citiranje imena fajlova koja imaju engleske skraćenice prikazuje kako ovo može postati prilično komplikovano jer je nisku sa apostofom lakše zaštititi navodnicima:

$ find . -name "file-containing-can't" -exec grep "can't" '{}' \; -print

Pretraga svih fajlova određenog korisnika[uredi | uredi izvor]

$ find . -user <userid>

Pretraga uz ignorisanje veličine slova[uredi | uredi izvor]

Primetite da -iname nije standardan i neće biti podržan kod svih primena:

$ find . -iname 'MyFile*'

Ako -iname nije podržan na vašem sistemu možete koristiti:

$ find . -name '[mM][yY][fF][iI][lL][eE]*'

Da bi se izgradila komanda iznad koristi se Perl(obično kod ovakve upotrebe znakovi nisu dobro citirani pre unošenja u standardni ulaz`sh`):

$ echo 'MyFile*' | perl -pe 's/([a-zA-Z])/[\L\1\U\1]/g;s/(.*)/find . -name \1/' | sh

Pretraga po veličini[uredi | uredi izvor]

Pretraga fajlova čija je veličina između 100 kilobajta i 500 kilobajta:

$ find . -size +100k -a -size -500k

Pretraga praznih fajlova:

$ find . -size 0k

Pretraga nepraznih fajlova:

$ find . ! -size 0k

Pretraga po veličini i imenu[uredi | uredi izvor]

$ find /usr/src ! \( -name '*,v' -o -name '.*,v' \) '{}' \; -print

Ova komanda će pretražiti /usr/src direktorijum. Svi fajlovi oblika '*,v' i '.*,v' su isključeni. Važni argumenti koje treba napomenuti nalaze se u tooltip.

for file in `find /opt \( -name error_log -o -name 'access_log' -o -name 'ssl_engine_log' -o -name 'rewrite_log' -o
-name 'catalina.out' \) -size +300000k -a -size -5000000k`; do
cat /dev/null > $file
done

U [bckw] jedinice su sledeće, 'b' znači 512-bajtnih blokova, 'c' znači bajt, 'k' znači kilobajt and 'w' znači 2-bajtne reči. Veličina ne računa indirektne blokove, ali računa blokove u retkim fajlovima koji nisu zapravo dodeljeni.

Srodne komande[uredi | uredi izvor]

  • locate komanda koja pretražuje baѕu podataka koja je sačinjena od fajlova umesto direktorijuma. Brža je od komande find ali i manje precizna ѕato što baza podataka možda nije nadograđena.
  • grep komanda pretražuje datoteke ili standardni ulaz, tražeći redove teksta koji odgovaraju zadatom regularnom izrazu, i ispisuje ih na standardni izlaz.

Reference[uredi | uredi izvor]

  1. ^ McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971—1986 (PDF) (Tehnički izveštaj). CSTR. Bell Labs. 139. 
  2. ^ „libarchive/libarchive”. GitHub. Pristupljeno 2015-10-04. 

Spoljašnje veze[uredi | uredi izvor]