Vyhledßvßnφ v Linuxu/Unixu

B∞₧nß linuxovß distribuce dnes obsahuje deseti tisφce r∙zn²ch soubor∙. Pokud se k tomu p°iΦtou u₧ivatelskß data, zv∞tÜφ se uvedenß hodnota na statisφce a v p°φpad∞ server∙ to mohou b²t i mili≤ny soubor∙. ObyΦejnΘho u₧ivatele nemusφ 99 % 'distribuΦnφch' soubor∙ zajφmat, ale i v domovskΘm adresß°i se Φasem vytvo°φ p∞kn∞ koÜat² strom adresß°∙, a to se potom zaΦφnajφ objevovat myÜlenky typu "Kam jsem to jen ulo₧il?". Prßv∞ v tom okam₧iku nastßvß vhodnß chvφle, kdy p°ijdou k dobru vyhledßvacφ nßstroje, kter²ch existuje celß °ada, ale jak u₧ to chodφ (a v systΘmech unixovΘho typu zvlßÜ¥), ne ka₧d² je vhodn² na vÜechno.

Prvnφm programem je locate, resp. bezpeΦn∞jÜφ slocate (locate dnes b²vß symbolick² odkaz na slocate). Tento nßstroj neprochßzφ diskem, ale pou₧φvß vlastnφ databßzi (v p°φpad∞ RedHatu je tato databßze ulo₧ena v souboru /var/lib/slocate/slocate.db), tak₧e je velmi rychl². Pou₧itφ je velmi snadnΘ:
$locate "*.htm?"
Uveden² p°φkaz vyhledß vÜechny soubory, kterΘ odpovφdajφ zadanΘ masce. OvÜem za rychlost se platφ, v tomto p°φpad∞ mo₧nou neaktußnostφ databßze. Tomu lze snadno zabrßnit pravidelnou aktualizacφ p°φkazem updatedb, ke kterΘ m∙₧ete vyu₧φt dΘmona cron. VÜechny distribuce, se kter²mi jsem se setkal (RedHat, Mandrake, SuSE) databßzi aktualizujφ jednou denn∞ a v p°φpad∞ pot°eby m∙₧e aktualizaci spustit i superu₧ivatel. Ten m∙₧e takΘ ovlivnit, kterΘ adresß°e nebo celΘ souborovΘ systΘmy se majφ indexovat. Jist∞ by bylo nevhodnΘ zahrnovat do databßze i obsah disket nebo CD.
Pokud se nechcete spolΘhat na systΘmovou databßzi, m∙₧ete si vytvo°it vlastnφ:
$updatedb -U ~ -o .my.db
Volba -U urΦuje startovnφ adresß°, ve kterΘm zaΦne indexovßnφ a volba -o soubor, do kterΘho bude vaÜe databßze ulo₧ena. P°i hledßnφ potom musφte explicitn∞ urΦit, ₧e chcete pou₧φt soukromou databßzi, k Φemu₧ slou₧φ p°epφnaΦ -d <vaÜe_db>:
$locate -d ~/.my.db dopis
Specializovan∞jÜφm programem je p°φkaz which, kter² hledß spustitelnΘ soubory v adresß°φch uveden²ch v prom∞nnΘ PATH. Nap°.
$which links
/usr/local/bin/links
Zajφmavou variantou m∙₧e b²t kombinace s p°φkazem file
$file `which ps2pdf`
/usr/bin/ps2pdf: Bourne shell script text executable
kter² krom∞ informace o umφst∞nφ souboru prozradφ dalÜφ zajφmavΘ informace, v tomto p°φpad∞ ₧e jde o skript pro Bourne shell (bash).

T°etφm nßstrojem je whereis a funguje op∞t trochu jinak. Prohledßvß jenom urΦitΘ adresß°e - kterΘ to jsou se dozvφte v jeho manußlovΘ strßnce. Mno₧inu adresß°∙ nem∙₧ete ovlivnit, ale program na oplßtku poskytne informace nejen o umφst∞nφ souboru, ale takΘ o tom, kde se nachßzφ jeho zdrojov² k≤d a manußlovß strßnka. Nap°.
$whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz
Z v²sledku je vid∞t, ₧e program ls se na nachßzφ v adresß°i /bin a manußlovß strßnka v /usr/share/man/man1. Zdrojov² k≤d nenφ nainstalovßn.

Jako poslednφ z textov²ch nßstroj∙ jsem si nechal find. Jeho pou₧itφ je nejkomplikovan∞jÜφ, ale takΘ nejmocn∞jÜφ. Ve spojenφ s dalÜφmi programy (nap°. sed) jφm lze realizovat i hromadnΘ p°ejmenovßvßnφ soubor∙, ale to u₧ je tΘma na jin² Φlßnek. NejjednoduÜÜφ pou₧itφ je
$find . -print
co₧ vypφÜe vÜechny soubory v aktußlnφm adresß°i a jeho podadresß°φch. Parametr -print nenφ nutn², ale na n∞kter²ch systΘmech nemusφ find vypsat celou cestu k hledanΘmu souboru, tak₧e hledßnφ bude k niΦemu. Prßv∞ tomu -print zabrßnφ. NicmΘn∞ mn∞ se to ned∞je, tak₧e u₧ ho nadßle uvßd∞t nebudu.
Chcete-li najφt konkrΘtnφ soubor, pou₧ijte parametr -name:
$find /etc/ -name srm.conf 
M∙₧ete samoz°ejm∞ pou₧φvat b∞₧nΘ ₧olφkovΘ znaky, ale potom musφte uzav°φt v²raz do apostrof∙ nebo uvozovek anebo p°ed ka₧d² ₧olφkov² znak p°idat obrßcenΘ lomφtko (nßsledujφcφ p°φkazy jsou tedy ekvivalentnφ):
$find ~ -name '*.ps'
$find ~ -name \*.ps
Chcete-li se dozv∞d∞t o nalezen²ch souborech n∞jakΘ podrobnosti (stejnΘ jako u ls -l), pou₧ijte
$find ~ -name \*.ps -ls 
V²sledky hledßnφ lze omezit parametrem -type jen na urΦit² typ souboru:
$find ~ -type d -name \*html 
vyhledß pouze adresß°e jejich₧ nßzev konΦφ °et∞zcem 'html'. Jak je vid∞t, podmφnek m∙₧e b²t n∞kolik a co vφc, mohou b²t up°esn∞ny logick²mi operßtory:
$find ~ \! -name \*.ps 
nalezne vÜechny soubory bez p°φpony *.ps. Pou₧itφ logickΘho AND a OR ukazujφ nßsledujφcφ dva p°φkazy:
$find . -atime -7 -a -size +1000
$find . -atime -7 -o -size +1000
Prvnφ p°φkaz nalezne soubory, ke kter²m se p°istupovalo b∞hem poslednφch 7 dn∙ a zßrove≥ jsou v∞tÜφ ne₧ 1000 512-bajtov²ch blok∙ (p°idßnφm pφsmene 'k' k velikosti se zm∞nφ hodnota z blok∙ na kilobajty). ZnamΘnko '+' znaΦφ, ₧e chceme soubory v∞tÜφ ne₧ udanß hodnota, mφnus funguje opaΦn∞. Bez znamΘnka se budou hledat pouze soubory o p°esn∞ odpovφdajφcφ velikosti.
Druh² p°φkaz vypφÜe soubory, ke kter²m se b∞hem poslednφch 7 dn∙ p°istupovalo nebo jsou v∞tÜφ ne₧ 1000 blok∙.
OvÜem m∙₧eme pou₧φt vφce v²raz∙, jejich₧ prioritu urΦujφ zßvorky, kterΘ musφ b²t p°ed shellem ochrßn∞ny zp∞tn²mi lomφtky (P°φkaz vypφÜe vÜechny soubory pochßzejφcφ z programu KWord, jejich₧ obsah byl zm∞n∞n p°ed deseti a vφce dny a jsou v∞tÜφ ne₧ 10 kB.):
$find . \( -mtime +10 -a -size +10k \) -a -name \*.kwd 
Dosud jsme jenom hledali, jenom₧e find umφ daleko vφce. N∞kterΘ programy automaticky vytvß°φ zßlo₧nφ kopie soubor∙, kterΘ se poznajφ podle tradiΦnφ tildy p°ipojenΘ k nßzvu. Ty vÜak v∞tÜinou jenom zabφrajφ mφsto, tak₧e neÜkodφ je Φas od Φasu smazat p°φkazem
$find . -name \*~ -ok rm {} \; 
Argument -ok zp∙sobφ, ₧e se vßs p°φkaz u ka₧dΘho nalezenΘho souboru zeptß, zde ho chcete opravdu smazat. AvÜak find m∙₧e spustit jak²koliv jin² program pomocφ parametru -exec.
$find . -name dopis -exec cat {} \; 
nalezne soubor dopis a vypφÜe jeho obsah na obrazovku. ╚asto se find pou₧φvß ve spojenφ s rourami a grepem.
$find . -name \*.c | xargs grep 'is_id'  2> /dev/null

nalezne zdrojovΘ k≤dy obsahujφcφ identifikßtor id_id a vypφÜe p°φsluÜn² °ßdek (standardnφ chybov² v²stup je p°esm∞rovßn). Xargs je dalÜφ program, kter² spustφ p°φkaz i s parametry (v tomto p°φpad∞ grep 'is_id') a dalÜφ parametry Φte ze standardnφho vstupu, v tomto p°φpad∞ od find.

O p°φkazu find by se dalo napsat mnoho, ale pokud se chcete dozv∞d∞t vφce, pak doporuΦuji jako u vÜech ostatnφch manußlovΘ strßnky. Jenom bych upozornil na fakt, ₧e prochßzenφ cel²m adresß°ov²m stromem m∙₧e trvat docela dlouho, tak₧e pokud si chcete jenom 'hrßt' doporuΦuji zvolit si k tomu n∞jak² menÜφ adresß°. Druhß p°ipomφnka se t²kß soubor∙, kterΘ ve jmΘn∞ obsahujφ mezeru, uvozovky apod. TakovΘ soubory nemusφ find zpracovat korektn∞ - respektive samotnΘmu findu problΘmy d∞lat nebudou, ale pokud budete chtφt na takov² soubor aplikovat n∞jakou akci, m∙₧ete se setkat s problΘmy. N∞kdy jde podobnΘ problΘmy vy°eÜit vhodn²m pou₧itφm uvozovek a apostrof∙, ale ani tato opat°enφ nejsou vÜemocnß.

A abych nezapomn∞l na zatvrzelΘ u₧ivatele grafick²ch program∙, v KDE je p°φtomen KFind a samoz°ejm∞ i Gnome mß sv∙j vyhledßvacφ nßstroj. Oba programy jsou vlastn∞ grafickΘ nadstavby ke zmφn∞n²m textov²m program∙m. KFind se velmi podobß vyhledßvacφmi dialogu ve Windows, ale velkou v²hodu mß v mo₧nosti pou₧φvat regulßrnφ v²razy a v KDE 3 je dokonce mo₧nΘ si regulßrnφ v²raz naklikat!

Kfind

VÜechny p°φkazy jsem zkouÜel v Linuxu, ale fungovat by m∞ly i v jin²ch systΘmech, kterΘ n∞jak²m zp∙sobem vychßzejφ z unix∙ (nap°. FreeBSD, BeOS, AtheOS apod.).

Dotazy, p°ipomφnky, nebo p°φsp∞vky do tΘto rubriky posφlejte na adresu petr.kinst@seznam.cz