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 done
faz um loop pelos arquivos especificados porCOMMAND
, define a variávelFILE
para o arquivo atual e executaCOMMANDS
. -
grep foo $FILE
pesquisafoo
em$FILE
e envia os resultados diretamente para a tela. -
unset IFS
define o separador de campo interno de volta ao seu valor padrão (não necessário em um script).