otázka ohledně find a -exec
Zdravím, chtěl bych zeptat, když mám příkaz
find -name "*" -exec prikaz {} \;
Co zde znamenají ty dvě závorky a proč je backslashovaný středník? Děkuji
Zdravím, chtěl bych zeptat, když mám příkaz
find -name "*" -exec prikaz {} \;
Co zde znamenají ty dvě závorky a proč je backslashovaný středník? Děkuji
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).
To `+` je ještě fajn a logické třeba u taru `find . -type d -mindepth 1 -maxdepth 1 -exec tar -cf archive.tar {} + #Zabal vse do jednoho taru` `find . -type d -mindepth 1 -maxdepth 1 -exec tar -cf {}.tar {} \; #Udelej pro kazdy adresar jeden tar` Ok, nemám páru, jaká je inblock code syntaxe...
Marek Bartík ( 2015-12-16 17:47:38 +0100 )editNa to bych daval pozor. find
takto spusti vetsinou jen jeden prikaz, ale muze jich byt vice (v pripade velkeho poctu nalezenych souboru). Muzes tak skoncit s archivem, kde nebudee vsechno.
Tez u te druhe veci: mindepth + maxdepth vede IMHO na pouziti for cyklu...
BTW: viz https://askfit.cz/question/1208/zvyrazneni-kodu-v-komentari/ take jsem se s tim pral ;]
Ten maximální počet se zjistí pomocí getconf ARG_MAX
. Jelikož archivuju složky v aktuálním adresáři (tj. nerekurzivně), tak trochu počítám s tím, že jich nebudu mít víc než 2097152
(hodnota z webdevu). Už jako víc jak 20 věcí mít ve složce je nepřehledná prasárna :-)
Tak jasný, byl to jen příklad. Ty meze se můžou měnit, přidat třeba mtime a další podmínky. Netvrdím, že je to ideální, ale je to přehledné a taková kostra pro jednoduché zálohy.
Jo a dík :)
{}
nahradí find
názvem nalezeného souboru (nebo souborů, pokud je příkaz -exec
ukončen plusem a ne středníkem).find
a poznal podle něj, kde končí -exec
.find
a -name
vložit adresář(e), kde se má hledat. Současné verze find
u už to sice nevyžadují, na rozdíl od toho, co běží na frayi, ale tam, kde to nevadí, je lepší dodržet zápis, který je zpětně kompatibilní.Já bych osobně s tou trojkou nepřeháněl, find to podporuje už tisíc let a to, že existuje něco tak dinosauřího jako fray, není důvodem k tomu, abych si přidělával práci na moderních systémech.
Miro Hrončok ( 2015-12-14 18:05:59 +0100 )editSouhlasím, že není dobré kompatibilitu přehánět. Zrovna tady ale podle mě nic nestojí a naopak má výhodu, že jasně vyznačuje, kde se bude hledat. V takové situaci bych ji dodržel.
Josef Kokeš ( 2015-12-14 20:38:50 +0100 )editAsked: 2015-12-13 20:29:22 +0100
Seen: 261 times
Last updated: Dec 13 '15