La sintassi è:
find ... -exec cmd {} +
find
troverà un numero di file basato sui criteri ...
e verrà eseguito cmd
con quell'elenco di percorsi di file come argomenti, il maggior numero possibile senza superare il limite della dimensione degli argomenti con un comando.
Se necessario, può dividere l'elenco dei file e chiamare cmd
più volte. Ad esempio, potrebbe finire per chiamare:
cmd ./file1 ./file2 ... ./file3000
cmd ./file3001 ./file3002 ... ./file4321
Un limite è che {}
deve essere l'ultimo. Ad esempio non puoi scrivere:
find ... -exec cmd {} other args +
come puoi con ';'
invece di '+'
.
Tu puoi scrivere:
find ... -exec echo foo {} +
ma no:
find ... -exec echo {} foo +
Quindi, se è necessario aggiungere alcuni argomenti aggiuntivi cmd
dopo l'elenco dei file, è necessario ricorrere alla chiamata di una shell. (Altri motivi per cui è necessario chiamare una shell potrebbero essere ogni volta che è necessario utilizzare una funzione di shell come reindirizzamenti, pipe, alcune espansioni di stringhe ....)
In sh -c 'inline-script' x a b c
, poiché inline-script
, $0
è x
, $1
è a
, $2
è b
... così "$@"
è l'elenco di questi 3 argomenti: a, bec. Quindi in:
find ... -exec sh -c 'cmd "$@" other arg' find-sh {} +
Per lo script inline , $0
(che viene utilizzato ad esempio quando si visualizzano messaggi di errore) è impostato su find-sh
ed "$@"
è l'elenco dei file (ciò che si find
espande {}
in).
Utilizzando lo exec
speciale built-in della shell:
find ... -exec sh -c 'exec cmd "$@" other arg' find-sh {} +
Diciamo alla shell di non eseguire un processo aggiuntivo da eseguire cmd
, ma invece di eseguirlo nello stesso processo (sostituendo il processo di esecuzione della shell con quel comando). Alcune conchiglie come bash
, zsh
e alcune implementazioni di ksh
farlo implicitamente per l'ultimo comando in uno script.
-exec sh -c '(cmd1; cmd2;)' find-sh {} +
?