Risposte:
Il modo migliore per farlo è utilizzare i parametri posizionali. Ed $()
è preferito per i backtick di sostituzione dei comandi perché è più leggibile (non è confuso con virgolette singole) e può essere facilmente nidificato senza dover eseguire molte operazioni di escape.
find . -exec bash -c 'echo Blah: $(stat -c %a "$@")' _ {} \;
Il carattere di sottolineatura è un segnaposto per $0
.
Per che cosa?
find ... -printf 'Blah: %m\n'
Oppure usa bash -c
se devi davvero:
find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
bash -c
o simili.
L'unico modo per usarli (AFAIK) è metterli in un file di script bash e usare lo script in -exec. Stessa cosa con$()
Non dimenticare xargs
! Il tuo esempio invocherebbe un nuovo processo di shell per ogni file trovato.
Preferirei questo:
find ... | xargs stat -c "Blah: %a"
find
genera un elenco di tutto ciò che è stato trovato, xargs
legge un elenco di argomenti stdin
ed esegue il suo parametro con tali argomenti sulla riga di comando, costruendo una riga di comando più lunga possibile. Funziona perché stat
, come la maggior parte degli altri comandi / programmi propri, accetta un numero qualsiasi di parametri. (confronta ls
, rm
e echo
per esempio)
Se ritieni che sia assolutamente necessario avviare un nuovo processo per ciascun file, utilizza xargs -n 1
solo per passare i 1
parametri a ciascun comando. In questo modo puoi imitare i metodi inefficienti come questo:
find ... | xargs -n 1 stat -c "Blah: %a"
(Provalo su un grande filesystem su un computer lento e cronometra le differenze!)
find
ancora che vengano eseguiti e il risultato viene utilizzato come parametro statico per find.