Com find:
cd /the/dir
find . -type f -exec grep pattern {} +
( -type fé apenas para pesquisar em arquivos regulares (também excluindo links simbólicos, mesmo que apontem para arquivos regulares). Se você deseja pesquisar em qualquer tipo de arquivo, exceto diretórios (mas tenha cuidado, existem alguns tipos de arquivos como fifos ou / dev / zero que você geralmente não quer ler), substitua -type fpelo específico do GNU ! -xtype d( -xtype dcorresponde a arquivos do diretório de tipos após a resolução do link simbólico)).
Com o GNU grep:
grep -r pattern /the/dir
(mas lembre-se de que, a menos que você tenha uma versão recente do GNU grep, seguirá links simbólicos ao descer para diretórios). Arquivos não regulares não serão pesquisados, a menos que você adicione uma -D readopção. grepPorém, versões recentes do GNU ainda não pesquisam dentro de links simbólicos.
Versões muito antigas do GNU findnão suportavam a {} +sintaxe padrão , mas era possível usar o não-padrão:
cd /the/dir &&
find . -type f -print0 | xargs -r0 grep pattern
É provável que as performances sejam vinculadas à E / S. Esse é o momento de fazer a pesquisa e o tempo necessário para ler todos os dados do armazenamento.
Se os dados estiverem em uma matriz de disco redundante, a leitura de vários arquivos por vez poderá melhorar o desempenho (e degradá-los de outra forma). Se os desempenhos não estiverem vinculados à E / S (porque, por exemplo, todos os dados estão em cache) e você tiver várias CPUs, o simultâneo também grepspoderá ajudar. Você pode fazer isso com xargsa -Popção do GNU .
Por exemplo, se os dados estiverem em uma matriz RAID1 com 3 unidades ou se os dados estiverem em cache e você tiver 3 CPUs cujo tempo de sobra:
cd /the/dir &&
find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(aqui usando -n1000para gerar um novo a grepcada 1000 arquivos, até 3 sendo executados em paralelo por vez).
No entanto, observe que, se a saída de grepfor redirecionada, você terminará com uma saída mal intercalada dos 3 grepprocessos; nesse caso, convém executá-la como:
find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern
(em um sistema recente GNU ou FreeBSD) ou use a --line-bufferedopção GNU grep.
Se patternfor uma sequência fixa, adicionar a -Fopção pode melhorar o assunto.
Se não forem dados de caracteres de vários bytes ou se for para a correspondência desse padrão, não importa se os dados são de caracteres de vários bytes ou não, então:
cd /the/dir &&
LC_ALL=C grep -r pattern .
poderia melhorar significativamente o desempenho.
Se você acaba fazendo essas pesquisas com frequência, convém indexar seus dados usando um dos muitos mecanismos de pesquisa existentes.
findwithxargsorgrep -R