É possível obter backticks de expansão “find -exec” para cada arquivo encontrado?

9

Aqui está um comando que funciona bem:

echo Blah: `stat -c %a .`

É possível find -execexecutar a mesma coisa para cada arquivo encontrado, {}no lugar de .?

RomanSt
fonte
1
Os backticks não podem funcionar lá porque eles são avaliados uma vez antes e findsão executados e o resultado é usado como um parâmetro estático para localização.
Sven

Respostas:

10

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.

Pausado até novo aviso.
fonte
6

Pelo que?

find ... -printf 'Blah: %m\n'

Ou use bash -cse você realmente precisar:

 find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
Ignacio Vazquez-Abrams
fonte
Obrigado por resolver meu problema imediato, mas ainda estou curioso para saber se os backticks podem ser usados ​​conforme descrito. Apenas para ampliar meus horizontes.
RomanSt
Você precisaria invocar o shell via bash -cou similar.
Ignacio Vazquez-Abrams
0

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$()

Hubert Kario
fonte
0

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"

findgera uma lista de tudo o que foi encontrado, xargslê uma lista de argumentos stdine 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, rme echopor exemplo)

Se você acha que é absolutamente necessário iniciar um novo processo para cada arquivo, use xargs -n 1apenas para passar 1parâ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!)

MattBianco
fonte
Agradeço o esforço, mas preciso desses bastidores. Obviamente, meu exemplo é simplificado e usa echo + stat; o script real não usa eco nem stat; portanto, seu truque para reuni-los na string de formato do stat não ajuda em nada.
RomanSt