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 -cse devi davvero:
find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
bash -co 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"
findgenera un elenco di tutto ciò che è stato trovato, xargslegge un elenco di argomenti stdined 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, rme echoper esempio)
Se ritieni che sia assolutamente necessario avviare un nuovo processo per ciascun file, utilizza xargs -n 1solo per passare i 1parametri 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!)
findancora che vengano eseguiti e il risultato viene utilizzato come parametro statico per find.