Em ambos os comandos, o problema é que não é grep , mas outro comando gera a saída real ( xargs e find , respectivamente).
Você pode resolver isso chamando diretamente grep para cada nome de arquivo:
IFS=$'\n'
for FILE in $(find . -iname "*.abc"); do
grep foo $FILE
done
unset IFS
Ou como um verso:
IFS=$'\n';for FILE in $(find . -iname "*.abc");do grep foo $FILE;done;unset IFS
Como funciona:
-
IFS=$'\n'define o separador de campo interno como o caractere de nova linha (ou os espaços nos nomes de arquivo causarão problemas). -
for FILE in $(COMMAND); do COMMANDS donefaz um loop pelos arquivos especificados porCOMMAND, define a variávelFILEpara o arquivo atual e executaCOMMANDS. -
grep foo $FILEpesquisafooem$FILEe envia os resultados diretamente para a tela. -
unset IFSdefine o separador de campo interno de volta ao seu valor padrão (não necessário em um script).