Dois problemas potenciais:
-
grep -R
(exceto o GNUgrep
modificado encontrado no OS / X 10.8 e acima) segue links simbólicos, portanto, mesmo que haja apenas 100 GB de arquivos em~/Documents
, ainda pode haver um link simbólico para/
Por exemplo, você acabará verificando todo o sistema de arquivos, incluindo arquivos como/dev/zero
. Usegrep -r
com o mais novo GNUgrep
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 reflete o fato de que o padrão é correspondido ou não).
-
grep
localiza as linhas que correspondem ao padrão. Para isso, tem que carregar uma linha de cada vez na memória. O% GNUgrep
, ao contrário de muitas outras implementaçõesgrep
, não tem um 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 mais próximos), maior que a memória disponível, ele falhará.Isso normalmente acontece com um arquivo esparso. Você pode reproduzi-lo com:
truncate -s200G some-file grep foo some-file
Essa é difícil de contornar. Você poderia fazer isso como (ainda com GNU
grep
):find ~/Documents -type f -exec sh -c 'for i do tr -s "
" "\n" < "$i" | grep --label="$i" -He "$0" done' Milledgeville {} +find ~/Documents -type f \( -size -100M -exec \ grep -He Milledgeville {} + -o -exec sh -c 'for i do tr -s "
" "\n" < "$i" | grep --label="$i" -He "$0" done' Milledgeville {} + \)find ~/Documents -type f -exec grep Milledgeville /dev/null {} +
Isso converte seqüências de caracteres NUL em um caractere de nova linha antes de alimentar a entrada para
grep
. Isso cobriria os casos em que o problema é devido a arquivos esparsos.Você pode otimizá-lo fazendo isso apenas para arquivos grandes:
truncate -s200G some-file grep foo some-file
Se os arquivos não forem esparsos e você tiver uma versão do GNU
grep
anterior ao2.6
, você pode usar a opção--mmap
. As linhas serão mapeadas na memória em vez de copiadas, o que significa que o sistema pode sempre recuperar a memória paginando as páginas para o arquivo. Essa opção foi removida no GNUgrep
2.6