Respuestas:
La mejor manera de hacerlo es usar parámetros posicionales. Y $()es preferible para la sustitución de comandos sobre backticks porque es más legible (no se confunde con comillas simples) y se puede anidar fácilmente sin tener que escapar mucho.
find . -exec bash -c 'echo Blah: $(stat -c %a "$@")' _ {} \;
El guión bajo es un marcador de posición para $0.
¿Para qué?
find ... -printf 'Blah: %m\n'
O úsalo bash -csi realmente tienes que:
find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
bash -co similar.
La única forma de usarlos (AFAIK) es colocarlos en un archivo de script bash y usar el script en -exec. Lo mismo con$()
No se olvide xargs! Su ejemplo invocaría un nuevo proceso de shell para cada archivo encontrado.
Prefiero esto:
find ... | xargs stat -c "Blah: %a"
findgenera una lista de todo lo encontrado, xargslee una lista de argumentos stdiny ejecuta su parámetro con esos argumentos en la línea de comando, construyendo una línea de comando lo más larga posible. Funciona porque stat, como la mayoría de los comandos / programas adecuados, toma cualquier número de parámetros. (comparar ls, rmy echopor ejemplo)
Si cree que es absolutamente necesario iniciar un nuevo proceso para cada archivo, use xargs -n 1para pasar solo los 1parámetros a cada comando. De esa manera, puede imitar los métodos ineficientes como este:
find ... | xargs -n 1 stat -c "Blah: %a"
(¡Pruébalo en un gran sistema de archivos en una computadora lenta y calcula las diferencias!)
findque incluso se ejecuten y el resultado se usa como un parámetro estático para encontrar.