Vyhledßvßnφ v Linuxu/UnixuB∞₧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.dbVolba -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 dopisSpecializovan∞jÜφm programem je p°φkaz which, kter² hledß spustitelnΘ soubory v adresß°φch uveden²ch v prom∞nnΘ PATH. Nap°. $which linksZajφmavou variantou m∙₧e b²t kombinace s p°φkazem file $file `which ps2pdf`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 lsZ 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 . -printco₧ 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.confM∙₧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'Chcete-li se dozv∞d∞t o nalezen²ch souborech n∞jakΘ podrobnosti (stejnΘ jako u ls -l ), pou₧ijte $find ~ -name \*.ps -lsV²sledky hledßnφ lze omezit parametrem -type jen na urΦit² typ souboru: $find ~ -type d -name \*htmlvyhledß 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 \*.psnalezne 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 +1000Prvnφ 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 \*.kwdDosud 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).
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