Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Informace
Obcování s ďáblem 15: Příkaz find stokrát jinak
31. října 2001, 00.00 | Se základy příkazu find a s jeho nejběžnějšími přepínači -name a -type jsme se seznámili minule. Dnes si ukážeme nejflexibilnější přepínač -exec, a naučíme se příkaz find opravdu používat.
Se základy příkazu find a s jeho nejběžnějšími přepínači -name a -type jsme se seznámili minule. Dnes si ukážeme nejflexibilnější přepínač -exec, a naučíme se příkaz find opravdu používat.Když standardní přepínače nestačí...
Jak už jsme se zmínili minule, kromě přepínačů -name a -type má příkaz //find celou řadu dalších, jež umožňují vyhledávat soubory podle času a data (nejen absolutně, ale i relativně vůči jinému souboru), podle vlastníka, podle přístupových práv,... kompletní seznam je uveden v dokumentaci, a můžete se na něj podívat zkusíte-li příkaz man find. I přes toto bohatství se však může stát, že bychom chtěli vyhledávat soubory podle nějakého atributu, pro který příkaz find přepínač prostě nemá — poměrně běžným příkladem je hledání podle obsahu souboru.
V takových případech můžeme použít univerzální přepínač -exec, který prostě zavolá libovolný příkaz, a zachová se podle jeho návratové hodnoty: je-li nulová (jak víme z desátého dílu, to znamená, že příkaz skončil bez problémů), soubor se vypíše; je-li nenulová, nestane se tak. Argumentem přepínače -exec je prostě volání příkazu; namísto jména souboru použijeme "{}", a celé to ukončíme středníkem (před něj ovšem musíme zapsat obrácené lomítko — měli byste už sami vědět proč).
Samozřejmě, že pro vyhledávání souborů podle obsahu se ideálně hodí náš starý známý, příkaz grep. Dříve než si to ukážeme v praxi, seznámíme se s trikem, který nám uspoří spoustu práce: jediný příkaz find totiž může obsahovat libovolné množství přepínačů. Testy, které reprezentují, se nad každým souborem provádějí postupně, a vypíší se jen ty soubory, jež projdou všemi podmínkami. Pro vyhledání třeba všech vývojářských dokumentů, ve kterých se píše o alertech, bychom mohli použít následující příkaz:
10 /Developer/Documentation> find . -name \*.html -exec fgrep -l AlertPanel {} \;
./Cocoa/TasksAndConcepts/ProgrammingTopics/ControlCell/Tasks/ValidatingControlEntries.html
./Cocoa/TasksAndConcepts/ProgrammingTopics/Dialog/toc.html
./Cocoa/TasksAndConcepts/ProgrammingTopics/Exceptions/Tasks/HandlingExceptions.html
./Cocoa/TasksAndConcepts/ProgrammingTopics/Exceptions/Tasks/NestingExceptionHandlers.html
./Cocoa/TasksAndConcepts/ProgrammingTopics/Sheets/toc.html
./ReleaseNotes/AppKitPreGM.html
11 /Developer/Documentation>
Příkaz find nejprve ověří, jde-li o soubor s příponou "html". Pokud ne, zkoumá ihned další soubor; pokud ano, spustí grep (varianta fgrep je zjednodušený grep, který sice umí pracovat jen s řetězci bez speciálních metaznaků, ale zato je rychlejší) s přepínačem -l, který zajistí, že grep vypisuje jen jména souborů a nesnaží se opisovat řádky, ve kterých požadovaný text nalezl (protože zobrazovat úseky HTML souborů v terminálu nemá valný smysl).
Mimochodem, stojí za to si uvědomit, že nalezené soubory vypisoval příkaz fgrep! Příkaz find totiž vypisuje jména souborů jen tehdy, když si je jist, že to neudělal nikdo jiný. Chceme-li však, aby to udělal zaručeně, bez ohledu na přepínače -exec, použijeme speciální přepínač -print (uvidíme jej v jednom příkladu za chvilku, a ještě se na něj znovu podíváme příště).
Kombinace přepínačů
Samozřejmě, že přepínače v příkazu find můžeme kombinovat zcela volně, vynalézavosti se meze nekladou. Chceme třeba najít všechny linky, jejichž jméno začíná velkým písmenem?
find ... -type l -name "[A-Z]*"
Zajímají nás jen ty složky (!), jejichž jméno obsahuje text "Cocoa", a které obsahují soubor Readme.txt, ve kterém je text "No guarantee"?
find ... -type d -name \*Cocoa\* -exec fgrep -q "No guarantee" {}/Readme.txt 2>/dev/null \; -print
Přepínač -q řekne příkazu grep, že má být zticha (Quiet), a neplést se se svými výpisy do toho, co vypíše find sám; přesměrování "2>/dev/null" zařídí to samé pro chybová hlášení (jinak by grep neustále "obtěžoval" hlášením, že v některých složkách není soubor "Readme.txt"). Konečně přepínač -print zajistí, aby se jméno nalezené složky skutečně vypsalo.
Přepínače můžeme skládat i do logických výrazů s použitím speciálních přepínačů -or a ! pro logický součet a pro negaci (chceme-li, můžeme použít i -and pro logický součin, ale jak už víme, není to zapotřebí: prosté řetězení přepínačů za sebou funguje stejně dobře). Pro sestavování logických výrazů můžeme používat i závorky. Před vykřičníkem a závorkami (stejně jako před středníkem o pár odstavců výše) musíme zapsat obrácená lomítka, aby je shell předal příkazu find beze změny (jinak by je jako speciální znaky interpretoval po svém; vyjma vykřičníku už byste měli z minulých dílů vědět jak).
Vyhledání všech obyčejných souborů, jež nemají příponu "cpp":
find ... -type f \! -name \*.cpp -print
Vyhledání všech HTML souborů, které obsahují "monitor" nebo "screen":
find ... -name \*.html \( -exec fgrep monitor {} \; -or -exec fgrep screen {} \; \) -print
A co příště?
Příště dokončíme povídání o příkazu find — mj. si ukážeme, jak se dá šikovně použít i na řadu dalších úkolů, mnohem složitějších, než pouhé vyhledávání souborů (ostatně, pozorní čtenáři to na základě popisu přepínače -exec už jistě tuší).
Obsah seriálu (více o seriálu):
- Obcování s ďáblem
- Obcování s ďáblem 2 - základy
- Obcování s ďáblem 3 - Práce se soubory
- Obcování s ďáblem 4 - Další práce se soubory
- Obcování s ďáblem 5 - Stále soubory, hlavně linky
- Obcování s ďáblem 6: Pár zbývajících drobností
- Obcování s ďáblem 7: Samá voda, přihořívá, hoří!
- Obcování s ďáblem 8: Jak se do shellu volá, tak se program ozývá
- Obcování s ďáblem 9: Nové finty na programy
- Obcování s ďáblem 10: Do fronty, pánové, do fronty!
- Obcování s ďáblem 11: Standardní vstup a výstup
- Obcování s ďáblem 13: Další triky
- Obcování s ďáblem 14: Vyšší škola hledání souborů
- Obcování s ďáblem 15: Příkaz find stokrát jinak
- Obcování s ďáblem 16: Co se ještě dá uvařit z příkazu find
- Obcování s ďáblem 17: Regulární výrazy
- Obcování s ďáblem 18: Speciální regulární výrazy
- Obcování s ďáblem 19: Skládání regulárních výrazů
- Obcování s ďáblem 20: Regulární výrazy se zpětnými odkazy
- Obcování s ďáblem 21:K čemu je dobrý grep...
- Zázraky ihned, nemožné na počkání: sed
- Obcování s ďáblem - další finty s příkazem sed
- Rozsáhlejší příklad se sedem
- Obcování s ďáblem: Další kouzla, aneb awk
- Awk a proměnné
- Obcování s ďáblem 27: Awk a výrazy
- Obcování s ďáblem: Awk a funkce
- Awk a příkazy
- Co je to vlastně "uživatel"?
- Vlastnictví objektů
- Přístupová práva
- Vlastník, skupina, ostatní...
- Jak je to se skupinami?
- Skupiny a uživatelé
- Scripty
- Komentáře, a volba shellu
- Pro skript může být shell cokoli!
- Shellové skripty a argumenty
- Skripty a proměnné: aritmetika
- Proměnné shellu, "dědění" hodnot
- Práce s proměnnými
- Práce se jmény souborů
- Pole hodnot
- Další triky kolem polí...
- Standardní proměnné shellu
- Základní příkazy pro skripty
- Příkaz if
- Speciální podmínkové příkazy
- Podmínky pro práci se soubory
- Jednoduchý cyklus
- Příkaz for a pomocné příkazy break a continue
- Příkaz case
- Příkazy exit a select
- Rejstřík a přehled
- Procesy
- Informace o procesech
- Další klíčová slova pro příkaz ps
- Příkaz ps: několik praktických přepínačů
- A k čemu že je "ps" dobré?
- Copak procesor, s pamětí je to horší
- Virtuální paměť
- A ještě jednou virtuální paměť
- Zpět k příkazu ps
- Skutečný žrout paměti
- Ještě jednou top
- Doplněk k topu: vm_stat
- Co to tedy všechno znamená?
- Nevychází nám dal a má dáti?
- Kam se stránky ukládají?
- Změna odkládacího disku
- Změna odkládacího disku / fstab
- Poslední poznámka k fstab
- A jak to je se soubory?
- Co vlastně příkaz lsof vypisuje?
- Příkaz lsof a obsah sloupce NAME
- SIPS - Terminál není jen pro nadšence UNIXu
- Tak nám zabili NetInfo, paní Müllerová
Tématické zařazení: