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