$ find . -name '*.c' | grep 'stdlib.h'
Isso canaliza a saída (stdout) * de find
para (stdin of) * grep 'stdlib.h'
como texto (ou seja, os nomes dos arquivos são tratados como texto). grep
faz o mesmo e encontra as linhas correspondentes neste texto (qualquer nome de arquivo que contenha o padrão). O conteúdo dos arquivos nunca é lido.
$ find . -name '*.c' | xargs grep 'stdlib.h'
Isso cria um comando grep 'stdlib.h'
para o qual cada resultado de find
é um argumento - portanto, ele procurará correspondências dentro de cada arquivo encontrado por find
( xargs
pode ser considerado como transformando seu stdin em argumentos para os comandos fornecidos) *
Use -type f
no seu comando find ou você obterá erros de grep
para os diretórios correspondentes. Além disso, se os nomes dos arquivos tiverem espaços, xargs
será muito ruim, portanto, use o separador nulo adicionando -print0
e xargs -0
para obter resultados mais confiáveis:
find . -type f -name '*.c' -print0 | xargs -0 grep 'stdlib.h'
* adicionou esses pontos extras explicativos como sugerido no comentário de @cat