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 f
pelo específico do GNU ! -xtype d
( -xtype d
corresponde 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 read
opção. grep
Porém, versões recentes do GNU ainda não pesquisam dentro de links simbólicos.
Versões muito antigas do GNU find
nã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 greps
poderá ajudar. Você pode fazer isso com xargs
a -P
opçã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 -n1000
para gerar um novo a grep
cada 1000 arquivos, até 3 sendo executados em paralelo por vez).
No entanto, observe que, se a saída de grep
for redirecionada, você terminará com uma saída mal intercalada dos 3 grep
processos; 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-buffered
opção GNU grep
.
Se pattern
for uma sequência fixa, adicionar a -F
opçã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.
find
withxargs
orgrep -R