Para expressar o comando de Nicole Hamilton de uma forma mais concisa, você pode usar o sinalizador -exec no comando find.
find /usr/portage -name '*.ebuild' -exec grep RESTRICT {} \;
Isso passa os nomes dos arquivos correspondentes para o grep com as chaves sendo substituídas pelo nome do arquivo. O '\;' é um escape '; isso é usado para significar o fim do comando.
Desempenho @garyjohn
Esta é uma comparação de diferentes tempos para executar o comando find. Todos esses testes foram executados contra um instantâneo recente do portage ( link ). Eu corri 'encontrar'. e 'grep -Rni. ' antes de cronometrar esses testes, por isso espero que o cache de disco e memória RAM seja simulado em todos os testes.
Aqui está o tempo para os dois comandos:
% time grep RESTRICT $(find . -name "*.ebuild") > /dev/null
grep --color RESTRICT $(find . -name "*.ebuild") > /dev/null 0.05s user 0.13s system 95% cpu 0.192 total
% time find . -name "*.ebuild" -exec grep RESTRICT {} \; > /dev/null
find . -name "*.ebuild" -exec grep RESTRICT {} \; > /dev/null 0.68s user 2.63s system 14% cpu 22.523 total
Como você pode ver, o método cat é muito mais rápido em cerca de 5% do tempo do meu exemplo.
No entanto, se o comando find retornar muitos arquivos, teremos um limite do shell com o comprimento de um único comando. Isso fará com que o comando falhe.
% time grep RESTRICT $(find . -name "*") > /dev/null
zsh: argument list too long: grep
grep --color RESTRICT $(find . -name "*") > /dev/null 0.34s user 0.04s system 99% cpu 0.374 tota
Para ver este limite no uso do seu sistema.
getconf ARG_MAX
Aqui encontra-se a execução com o mesmo glob. Observe que leva muito tempo para ser concluído, mas sai com sucesso.
% time find . -name "*" -exec grep RESTRICT {} \; > /dev/null
find . -name "*" -exec grep RESTRICT {} \; > /dev/null 2.52s user 11.00s system 12% cpu 1:47.67 total
A maneira ideal de executar este comando é usar xargs.
% time find . -name "*" -print0 | xargs -0 grep RESTRICT > /dev/null
find . -name "*" -print0 0.16s user 0.29s system 51% cpu 0.886 total
xargs -0 grep RESTRICT > /dev/null 0.33s user 0.59s system 100% cpu 0.915 total
Usando o xargs, é possível percorrer toda a árvore do portage (~ 159995 arquivos, 724M) em pouco menos de 2 segundos.