¿Es posible obtener "encontrar -exec" expandir backticks para cada archivo encontrado?

9

Aquí hay un comando que funciona bien:

echo Blah: `stat -c %a .`

¿Es posible find -execejecutar lo mismo para cada archivo encontrado, {}en lugar de .?

RomanSt
fuente
1
Los backticks no pueden funcionar allí porque se evalúan una vez antes de findque incluso se ejecuten y el resultado se usa como un parámetro estático para encontrar.
Sven

Respuestas:

10

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.

Pausado hasta nuevo aviso.
fuente
6

¿Para qué?

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

O úsalo bash -csi realmente tienes que:

 find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
Ignacio Vazquez-Abrams
fuente
Gracias por resolver mi problema inmediato, pero todavía tengo curiosidad por saber si los backticks se pueden usar como se describe. Solo para ampliar mis horizontes.
RomanSt
Tendría que invocar el shell a través de bash -co similar.
Ignacio Vazquez-Abrams
0

La única forma de usarlos (AFAIK) es colocarlos en un archivo de script bash y usar el script en -exec. Lo mismo con$()

Hubert Kario
fuente
0

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!)

MattBianco
fuente
Aprecio el esfuerzo, pero necesito esos backticks. Obviamente mi ejemplo está simplificado y usa echo + stat; el script real no utiliza ni echo ni stat, por lo que su truco de juntarlos en la cadena de formato de stat no ayuda en absoluto.
RomanSt