Em geral, existem pelo menos três maneiras de fazer uma combinação find + grep :
-
grep padrão 'find dir especificadores de localização -print'
-
find dir especificadores de localização -exec grep padrão {} \;
-
find dir especificadores de localização -print | xargs grep padrão
E, claro, não há nada de especial sobre grep aqui; esses mesmos três padrões podem ser usados para find mais qualquer comando.
O número 1 é, em certo sentido, a maneira mais antiga e básica, já que os quadros de retorno sempre foram a maneira de capturar a saída de um comando e usá-lo na linha de comando de outro. (Nos dias de hoje, tenho a impressão de que há uma base mais nova que é melhor do que backquotes e que todas as crianças legais usam, mas acho que sou uma veterana.) A desvantagem do número 1 é que find encontra muito de arquivos, você pode obter o erro "Linha de comando muito longa".
O número 2 é um recurso especial incorporado em find para fazer uma combinação de comandos find +. Está tudo bem, mas tem duas desvantagens: (1) ele invoca novamente o comando auxiliar ( grep ou qualquer outro) para cada arquivo encontrado, então pode ser lento, e (2) se o comando auxiliar é grep , já que cada chamada de grep vê um nome de arquivo, ele não listará os nomes de arquivo na correspondência, embora você possa contornar isso fazendo -exec grep padrão {} /dev/null \; ou Atualmente, -exec grep -H padrão {} \; .
E depois há o número 3. Até onde eu sei, xargs foi inventado para contornar as limitações dos dois primeiros. Embora o xargs seja, teoricamente, um programa de propósito geral, suspeito que na prática quase nunca seja usado com qualquer par de programas além de find e grep . Trabalha completamente em torno da desvantagem de # 1; ele funcionará com um número arbitrário de arquivos encontrados. É eficiente, mas se você tiver azar, ocasionalmente invocará grep one um último nome de arquivo, o que significa que você ainda desejará usar o truque /dev/null ou -H . E tem uma desvantagem própria: não funciona se algum dos nomes de arquivo encontrados contiver espaços em branco. Mas há uma maneira de contornar isso também:
find dir especificadores de localização -print0 | xargs -0 grep padrão
(Eu desejo que xargs tenha sido escrito para aceitar nomes de arquivos separados por novas linhas em sua entrada por padrão em vez de espaços em branco, mas isso é um discurso para outro dia.)