Komanda find (juniks)
Originalni autor(i) | Dick Haight |
---|---|
Programer(i) | Belove laboratorije |
Operativni sistem | Juniks |
Tip | Naredba (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:
- b - block device (buffered);
- c - character device (unbuffered);
- d - direktorijum;
- f - regular file;
- l - symbolic link;
- p - named pipe;
- s - socket;
- D - door.
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 komandefind
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]
- ^ 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.
- ^ „libarchive/libarchive”. GitHub. Pristupljeno 2015-10-04.
Spoljašnje veze[uredi | uredi izvor]
- The Single UNIX® Specification, Issue 7 from The Open Group : find files – Commands & Utilities Reference,
- Official webpage for GNU find
- Command find – 25 practical examples