¿Cómo uso una tubería en el parámetro exec para un comando de búsqueda?

StackOverflow https://stackoverflow.com/questions/62044

  •  09-06-2019
  •  | 
  •  

Pregunta

Estoy intentando construir un comando de búsqueda para procesar un montón de archivos en un directorio usando dos ejecutables diferentes.Desafortunadamente, -exec en buscar no permite usar tubería o incluso \| porque el shell interpreta ese carácter primero.

Esto es específicamente lo que estoy tratando de hacer (que no funciona porque la tubería finaliza el comando de búsqueda):

find /path/to/jpgs -type f -exec jhead -v {} | grep 123 \; -print
¿Fue útil?

Solución

Prueba esto

find /path/to/jpgs -type f -exec sh -c 'jhead -v {} | grep 123' \; -print

Alternativamente, puedes intentar insertar tu declaración ejecutiva dentro de un script sh y luego hacer:

find -exec some_script {} \;

Otros consejos

Un enfoque ligeramente diferente sería utilizar xargs:

find /path/to/jpgs -type f -print0 | xargs -0 jhead -v | grep 123

que siempre me resultó un poco más fácil de entender y adaptar (los argumentos -print0 y -0 son necesarios para hacer frente a nombres de archivos que contienen espacios en blanco)

Este podría (no probado) será más efectivo que usar -exec porque canalizará la lista de archivos a xargs y xargs asegura que la línea de comando jhead no sea demasiado larga.

Con -exec sólo puede ejecutar un único ejecutable con algunos argumentos, no comandos de shell arbitrarios.Para evitar esto, puede utilizar sh -c '<shell command>'.

Tenga en cuenta que el uso de -exec es bastante ineficiente.Para cada archivo que se encuentre, el comando debe ejecutarse nuevamente.Sería más eficiente si pudiera evitar esto.(Por ejemplo, moviendo el grep afuera de -exec o canalizar los resultados de find a xargs como lo sugiere palmín.)

Usando find El comando para este tipo de tarea tal vez no sea la mejor alternativa.Utilizo el siguiente comando con frecuencia para buscar archivos que contengan la información solicitada:

for i in dist/*.jar; do echo ">> $i"; jar -tf "$i" | grep BeanException; done

Como esto genera una lista, ¿no sería así?

find /path/to/jpgs -type f -exec jhead -v {} \; | grep 123

o

find /path/to/jpgs -type f -print -exec jhead -v {} \; | grep 123

Ponga su grep en los resultados de find -exec.

Hay otra forma de hacerlo, pero también es bastante gueto.

Usando la opción de Shell extquote, puedes hacer algo similar a esto para buscar cosas ejecutivas y luego canalizarlas a sh.

root@ifrit findtest # find -type f -exec echo ls $"|" cat \;|sh
filename


root@ifrit findtest # find -type f -exec echo ls $"|" cat $"|" xargs cat\;|sh
h

Simplemente pensé en agregar eso porque al menos tal como lo visualicé, estaba más cerca de la pregunta original del OP sobre el uso de tuberías dentro del ejecutivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top