Portál AbcLinuxu, 10. května 2025 04:54
-exec
-exec
a následně, jak program doběhne najde next objekt v adresáři (stromu) atd.Řešení dotazu:
find . -exec rm * {} \;tak bash ve skutečnosti udělá
execve("/usr/bin/find", ["find", ".", "-exec", "rm", "a", "b", "c", "{}", ";"], [/* 43 vars */]) = 0(tj. expanduje hvězdičku), přičemž find udělá clone() a
execve("/bin/rm", ["rm", "a", "b", "c", "."], [/* 43 vars */]) = 0což vyhodí tu hlášku
rm: cannot remove '.': Is a directorya smaže všechny tři soubory. Pak find skončí. Kdyby to nabufferoval a spouštěl to rm s každým souborem, tak by to vypsalo, že neexistuje a, b, c, a, a, b, c, b, a, b, c, c.
-exec command ; All following arguments to find are taken to be arguments to the command until an argument consisting of `;' is encountered. The specified command is run once for each matched file. -exec command {} + This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end; the total number of invocations of the command will be executed much less than the number of matched files. The command line is built in much the same way that xargs* builds its command lines. If find encounters an error, this can sometimes cause an immediate exit, so some pending commands may not be run at all. * The command line for command is built up until it reaches a system-defined limit
rm a rm b rm c rm d rm e rm fV druhém případě se zavolá třeba
rm a b c rm d e f
-exec
. V případě, že objekt je adresář, zastaví provádění, odloží seznam do zásobníku, a provede výběr v podadresáři a pokračuje podle předchozího.
To znamená, že pokud mám strukturu
W w a b X x c Y y Z z d(malá písmena jsou soubory, velká adresáře a odsazení znamená příslušnost do adresáře, pořadí je jak jsou v adresáři) Tak find si udělá seznam
a,b,c,d
z hlavního adresáře skočí do W
a udělá tam seznam a začne spracovávat w
. Než jej zpracuje (a následně a, b
) je možné s objekty x,y,z
libovolně pracovat bez toho že find bude hásit chybu. operace na d
způsobí, že find bude hlásit, že nenašel soubor.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.