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 (Dec 16 '15)Na 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 (Dec 14 '15)Souhlasí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š (Dec 14 '15)Asked: Dec 13 '15
Seen: 261 times
Last updated: Dec 13 '15