Dois problemas potenciais:
-
grep -R(exceto o GNUgrepmodificado 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 -rcom o mais novo GNUgrepou 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).
-
greplocaliza 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-fileEssa é 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-fileSe os arquivos não forem esparsos e você tiver uma versão do GNU
grepanterior 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 GNUgrep2.6