Ask Your Question
2

otázka ohledně find a -exec

asked 2015-12-13 20:29:22 +0100

mnhtrieu gravatar image

updated 2015-12-13 20:57:00 +0100

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

edit retag flag offensive close delete

2 Answers

Sort by » oldest newest most voted
4

answered 2015-12-13 20:58:36 +0100

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

edit flag offensive delete publish link more

Comments

uff.. snad vycerpavajici

VojtechMyslivec ( 2015-12-13 21:01:05 +0100 )edit

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

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 ( 2015-12-16 20:35:24 +0100 )edit

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 ( 2015-12-17 09:15:55 +0100 )edit
2

answered 2015-12-13 20:56:38 +0100

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í.
edit flag offensive delete publish link more

Comments

3.: good point ;]

VojtechMyslivec ( 2015-12-13 21:00:33 +0100 )edit

Jojo, díky moc hoši :)

mnhtrieu ( 2015-12-13 21:43:57 +0100 )edit

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

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š ( 2015-12-14 20:38:50 +0100 )edit

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: 2015-12-13 20:29:22 +0100

Seen: 261 times

Last updated: Dec 13 '15