GNU/Linux >> Tutoriales Linux >  >> Linux

¿Imprimir el nombre de archivo junto con los resultados de Grep en Find -exec?

Tengo un programa llamado foo que quiero ejecutar en cada resultado que se encuentra a través de find. Así que algo como esto:

find . -name '*.o' -type f -exec foo {} ;

Quiero grep el resultado de todas estas invocaciones de foo para una determinada barra de cuerdas. Así que agrego esto:

find . -name '*.o' -type f -exec foo {} ; | grep bar

Pero pierdo la información original sobre de qué archivos provienen las coincidencias. Intenté agregar -fprintf /dev/stderr '%pn' al find comando pero ahora parece que stdout se ha ido, porque no se imprimen los resultados de grep.

¿Cómo puedo obtener cada nombre de archivo impreso en la salida y LUEGO tener los resultados de grep correspondientes a ese archivo impreso después?

Alternativamente, si hubiera alguna forma de hacer que -H argumento de grep trabajo que también estaría bien, pero como está escrito, no funcionará porque solo estoy pasando texto desde stdin y grep no sabe el nombre del archivo. Probé varios encantamientos de xargs , pero tampoco pude hacer que nada de eso funcionara.

Respuesta aceptada:

Para obtener cada nombre de archivo impreso en la salida y LUEGO tener los resultados de grep correspondientes a ese archivo impreso después, puede envolver el -exec foo {} | grep tubería en una concha:

find . -name '*.o' -type f -print -exec sh -c 'foo "$1" | grep "bar"' sh {} ;

Para hacer el -H el argumento de grep funciona con entrada estándar, si su versión de grep admite --label= opción que podrías hacer

find . -name '*.o' -type f -exec sh -c '
  foo "$1" | grep -H --label="$1" "bar"
' sh {} ;

o (si su búsqueda es compatible con + alternativa de múltiples argumentos a ; ):

find . -name '*.o' -type f -exec sh -c '
  for f; do foo "$f" | grep -H --label="$f" "bar"; done
' sh {} +

Linux
  1. Grep con operadores lógicos?

  2. Buscar -exec + Vs Buscar | Xargs:¿Cuál elegir?

  3. ¿Obteniendo la opción -exec en Find To Work?

  4. encontrar -exec cmd {} + vs | xargs

  5. Une dos cadenas en una línea con grep

3 consejos para imprimir con Linux

Comando Grep en Linux (Buscar texto en archivos)

Cómo encontrar una cadena en un archivo en Linux

Encuentra archivos perdidos con Scalpel

Encuentra texto en archivos en Linux usando grep

Comando Grep en Linux (con ejemplos)