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

6

Aqui está um comando que funciona bem:

echo Blah: 'stat -c %a .'

É possível obter find -exec para executar a mesma coisa em todos os arquivos encontrados, com {} no lugar de . ?

    
por RomanSt 08.02.2011 / 14:23

4 respostas

6

A melhor maneira de fazer isso é usar parâmetros posicionais. E $() é preferido 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 escapar muito.

find . -exec bash -c 'echo Blah: $(stat -c %a "$@")' _ {} \;

O sublinhado é um marcador para $0 .

    
por 08.02.2011 / 14:53
6

Para quê?

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

Ou use bash -c se você realmente precisar:

 find . -exec bash -c 'echo Blah: 'stat -c %a {}'' \;
    
por 08.02.2011 / 14:29
0

A única maneira de usá-los (AFAIK) é colocá-los em um arquivo de script bash e usar o script em -exec. Mesma coisa com $()

    
por 08.02.2011 / 14:37
0

Não se esqueça de xargs ! Seu exemplo invocaria um novo processo de shell para cada arquivo encontrado.

Eu preferiria isso:

find ... | xargs stat -c "Blah: %a"

find mostra uma lista de todos os itens encontrados, xargs lê uma lista de argumentos em stdin e executa seu parâmetro com esses argumentos na linha de comando, construindo uma linha de comando o maior tempo possível. Isso funciona porque stat , como a maioria dos outros comandos / programas apropriados, usa qualquer número de parâmetros. (compare ls , rm e echo por exemplo)

Se você acha absolutamente necessário iniciar um novo processo para cada arquivo, use xargs -n 1 para passar o parâmetro 1 para cada comando. Dessa forma você pode imitar os métodos ineficientes como este:

find ... | xargs -n 1 stat -c "Blah: %a"

(Tente em um sistema de arquivos grande em um computador lento e tempo as diferenças!)

    
por 08.02.2011 / 15:09

Tags