grep -R
(exceto o GNU modificado grep
encontrado no OS / X 10.8 e posterior) segue links simbólicos, portanto, mesmo que haja apenas 100 GB de arquivos ~/Documents
, ainda pode haver um link simbólico, /
por exemplo, e você acabará verificando todo o sistema de arquivos, incluindo arquivos gosto /dev/zero
. Use grep -r
com o GNU mais recente grep
ou use a sintaxe padrão:
find ~/Documents -type f -exec grep Milledgeville /dev/null {} +
(no entanto, observe que o status de saída não refletirá o fato de o padrão corresponder ou não).
grep
localiza as linhas que correspondem ao padrão. Para isso, ele precisa carregar uma linha de cada vez na memória. O GNU grep
, ao contrário de muitas outras grep
implementações, não tem limite no tamanho das linhas que lê e suporta a pesquisa em arquivos binários. Portanto, se você tiver um arquivo com uma linha muito grande (ou seja, com dois caracteres de nova linha muito distantes), maior que a memória disponível, ele falhará.
Isso normalmente aconteceria com um arquivo esparso. Você pode reproduzi-lo com:
truncate -s200G some-file
grep foo some-file
Essa é difícil de contornar. Você poderia fazê-lo como (ainda com o GNU grep
):
find ~/Documents -type f -exec sh -c 'for i do
tr -s "\0" "\n" < "$i" | grep --label="$i" -He "$0"
done' Milledgeville {} +
Isso converte seqüências de caracteres NUL em um caractere de nova linha antes de alimentar a entrada grep
. Isso cobriria os casos em que o problema ocorre devido a arquivos esparsos.
Você pode otimizá-lo fazendo isso apenas para arquivos grandes:
find ~/Documents -type f \( -size -100M -exec \
grep -He Milledgeville {} + -o -exec sh -c 'for i do
tr -s "\0" "\n" < "$i" | grep --label="$i" -He "$0"
done' Milledgeville {} + \)
Se os arquivos não forem escassos e você tiver uma versão do GNU grep
anterior 2.6
, poderá usar a --mmap
opção As linhas serão mapeadas na memória, em vez de copiadas, o que significa que o sistema sempre pode recuperar a memória paginando as páginas para o arquivo. Essa opção foi removida no GNU grep
2.6