Le travail d'interprétation du symbole pipe comme une instruction pour exécuter plusieurs processus et diriger la sortie d'un processus vers l'entrée d'un autre processus est de la responsabilité du shell (/bin/sh ou équivalent).
Dans votre exemple, vous pouvez soit choisir d'utiliser votre coque de niveau supérieur pour effectuer la tuyauterie comme suit :
find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'
En termes d'efficacité, ce résultat coûte une invocation de find, de nombreuses invocations de zcat et une invocation d'agrep.
Cela entraînerait la création d'un seul processus agrep qui traiterait toute la sortie produite par de nombreuses invocations de zcat.
Si, pour une raison quelconque, vous souhaitez invoquer agrep plusieurs fois, vous pouvez :
find . -name 'file_*' -follow -type f \
-printf "zcat %p | agrep -dEOE 'grep'\n" | sh
Cela construit une liste de commandes utilisant des tubes à exécuter, puis les envoie à un nouveau shell pour être réellement exécutées. (Omettre le "| sh" final est un bon moyen de déboguer ou d'effectuer des simulations de lignes de commande comme celle-ci.)
En termes d'efficacité, ce résultat coûte une invocation de find, une invocation de sh, de nombreuses invocations de zcat et de nombreuses invocations d'agrep.
La solution la plus efficace en termes de nombre d'invocations de commandes est la suggestion de Paul Tomblin :
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
... qui coûte une invocation de find, une invocation de xargs, quelques invocations de zcat et une invocation d'agrep.
la solution est simple :exécutez via sh
... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;