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.)