Oboji je kvuli findu, aby vedel, jak s prikazem nakladat.
-exec
je akce, ktera rika, aby find "pro kazdy soubor" (viz nize) spustil prikaz. Ten muze byt libovolny a mit libovolny pocet parametru (prepinacu, argumentu, ...). No a samozrejme to nejdulezitejsi je pouziti jmena souboru, ktery find najde. Na to slouzi dvojznak {}
. V shellu to nic neznamena, ale find to pochopi tak, ze tento dvojznak nahradi jmenem souboru, ktery nasel. Pokud se ti to libi vice, muzes klidne pouzit "{}"
\;
je zase dalsi placeholder, ktery findu rekne, ze nyni uz konci zadavani parametru pro -exec
(a konci tim i dany prikaz). find chce videt strednik, ktery se bezne pouziva jako konec prikazu. Kdyz tam ale napises strednik, tak ho samozrejme bash "sezere" a find tento parametr vubec neobdrzi. Proto je treba ho ochranit. Pokud se nekomu libi vice, muze opet pouzit ";"
-exec
je akce jako kazda jina (napr -print
, -ls
) a ma svoji hodnotu (navratovy kod spusteneho prikazu) a muzes tak pokracovat v predikatech. Kdyby nebylo \;
, nemas jak findu rict "tady konci -exec
a zacina neco jineho.
Napr: find / -type f -exec test -x {} \; -print
najde tebou spustitelne soubory (simulace gnu -executable
).
Zaverem: neni treba pouzivat ;
, existuje i +
. To find reprezentuje tak, ze spusti jeden prikaz pro celou sadu nalezenych souboru (ktere umisti jako samostatne argumenty misto {}
). To se nekdy hodi hlavne kvuli vykonosti, kde se prikaz zavola radove menekrat.
Pokud tech souboru nebude mnoho (prilis mnoho), tak s +
spusti find pouze jeden prikaz.
Napr: find . -type f -name '*.sh' -exec chmod +x {} +
pro nastaveni execute prava vsem .sh souborum. Tento prikaz probehne radove rychleji nez to same s \;
misto +
(zalezi tedy na velikosti struktury a poctu .sh souboru).