Loading [MathJax]/jax/input/TeX/config.js
Ask Your Question
2

otázka ohledně find a -exec

asked Dec 13 '15

mnhtrieu gravatar image

updated Dec 13 '15

Josef Kokeš gravatar image

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

add a comment

2 Answers

Sort by » oldest newest most voted
4

answered Dec 13 '15

VojtechMyslivec gravatar image

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

link

Comments

uff.. snad vycerpavajici

VojtechMyslivec (Dec 13 '15)

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 ;]

VojtechMyslivec (Dec 16 '15)

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

Marek Bartík (Dec 17 '15)
add a comment
2

answered Dec 13 '15

Josef Kokeš gravatar image
  1. Symbol {} nahradí find názvem nalezeného souboru (nebo souborů, pokud je příkaz -exec ukončen plusem a ne středníkem).
  2. Středník je backslashovaný proto, že to je speciální symbol shellu, před kterým je nutné ho ochránit, aby ho dostal find a poznal podle něj, kde končí -exec.
  3. Je vhodné mezi find a -name vložit adresář(e), kde se má hledat. Současné verze findu 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í.
link

Comments

3.: good point ;]

VojtechMyslivec (Dec 13 '15)

Jojo, díky moc hoši :)

mnhtrieu (Dec 13 '15)

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)
add a comment

Your answer

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

Add answer

[hide preview]

Question tools

Follow
1 follower

Stats

Asked: Dec 13 '15

Seen: 261 times

Last updated: Dec 13 '15