Obcování s ďáblem 15: Příkaz find stokrát jinak - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Jaký fotograf/ka získal/a cenu za nejpopulárnější příspěvek v Nikon Photo Contest?

V dnešní soutěži hrajeme o:

Seriály

Více seriálů



Software

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):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Tipy z Internetu  

 » Rubriky  » Software  

Poslat článek

Nyní máte možnost poslat odkaz článku svým přátelům:

Váš e-mail:

(Není povinný)

E-mail adresáta:

Odkaz článku:

Vzkaz:

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: