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 {} +