El trabajo de interpretar el símbolo de tubería como una instrucción para ejecutar múltiples procesos y canalizar la salida de un proceso a la entrada de otro proceso es responsabilidad del shell (/bin/sh o equivalente).
En su ejemplo, puede elegir usar su shell de nivel superior para realizar la tubería de la siguiente manera:
find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'
En términos de eficiencia, este resultado cuesta una invocación de find, numerosas invocaciones de zcat y una invocación de agrep.
Esto daría como resultado la generación de un único proceso agrep que procesaría toda la salida producida por numerosas invocaciones de zcat.
Si por algún motivo desea invocar agrep varias veces, puede hacerlo:
find . -name 'file_*' -follow -type f \
-printf "zcat %p | agrep -dEOE 'grep'\n" | sh
Esto construye una lista de comandos usando canalizaciones para ejecutar, luego los envía a un nuevo shell para que realmente se ejecuten. (Omitir el "| sh" final es una buena manera de depurar o realizar ejecuciones en seco de líneas de comando como esta).
En términos de eficiencia, este resultado cuesta una invocación de find, una invocación de sh, numerosas invocaciones de zcat y numerosas invocaciones de agrep.
La solución más eficiente en términos de número de invocaciones de comandos es la sugerencia de Paul Tomblin:
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
... lo que cuesta una invocación de find, una invocación de xargs, algunas invocaciones de zcat y una invocación de agrep.
la solución es fácil:ejecutar a través de sh
... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;