Respostas:
A melhor maneira de fazer isso é usar parâmetros posicionais. E $()
é preferível para substituição de comandos em backticks, porque é mais legível (não é confundido com aspas simples) e pode ser facilmente aninhado sem ter que fazer muito para escapar.
find . -exec bash -c 'echo Blah: $(stat -c %a "$@")' _ {} \;
O sublinhado é um espaço reservado para $0
.
Pelo que?
find ... -printf 'Blah: %m\n'
Ou use bash -c
se você realmente precisar:
find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
bash -c
ou similar.
A única maneira de usá-los (AFAIK) é colocá-los em um arquivo de script bash e usar o script em -exec. A mesma coisa com$()
Não esqueça xargs
! Seu exemplo chamaria um novo processo de shell para cada arquivo encontrado.
Eu preferiria isso:
find ... | xargs stat -c "Blah: %a"
find
gera uma lista de tudo o que foi encontrado, xargs
lê uma lista de argumentos stdin
e executa seu parâmetro com esses argumentos na linha de comando, construindo a maior linha de comando possível. Funciona porque stat
, como a maioria dos outros comandos / programas adequados, aceita qualquer número de parâmetros. (comparar ls
, rm
e echo
por exemplo)
Se você acha que é absolutamente necessário iniciar um novo processo para cada arquivo, use xargs -n 1
apenas para passar 1
parâmetros para cada comando. Dessa forma, você pode imitar os métodos ineficientes como este:
find ... | xargs -n 1 stat -c "Blah: %a"
(Experimente em um grande sistema de arquivos em um computador lento e calcule as diferenças!)
find
são executados e o resultado é usado como um parâmetro estático para localização.