Não há muitos arquivos, mas a lista de argumentos para o comando grep
é muito longa. É uma limitação da chamada do sistema execve(2)
no tamanho combinado da lista de argumentos e lista de variáveis de ambiente transmitidas ao longo dessa chamada.
No Linux, desde 2.6.23, é um limite administrativo que pode ser aumentado ou elevado usando ulimit -s
(também define o limite no tamanho da pilha do processo). Então
ulimit -s unlimited
pode funcionar para você.
Caso contrário, soluções alternativas, a maioria das quais já mencionadas em outras respostas, consistem em dividir a lista de argumentos para que ela se encaixe nessa limitação ou evitar passar a lista de arquivos para execve
.
ls | xargs grep polyhedron
(OK apenas porque os nomes dos arquivos contêm apenas dígitos)
(É responsabilidade do xargs dividir a lista e executar quantos comandos grep
, conforme necessário, para que a limitação execve
não seja atingida).
find . -exec grep polyhedron {} +
O mesmo, mas, desta vez, find
faz a divisão.
grep -r polyhedron .
(se o seu grep suportar -r
), desta vez, apenas 3 args de alguns caracteres passaram para grep
, é grep
que constrói a lista de arquivos internamente e nunca os transmite para uma chamada de sistema execve.
Algumas shells têm suporte para .
Com shells em que grep
está embutido, você não teria o problema, já que os buildins não são executados com uma chamada de sistema execve
.
Com o ksh93, você pode usar:
command -x grep polyhedron *
E ksh93
fará a divisão.
zsh
tem o comando zargs
:
zargs * -- grep polyhedron
Para pesquisar mais de uma palavra, você pode fazer:
grep -e word1 -e word2 ...
Ou
grep 'word1
word2
...' ...
Ou coloque a lista de palavras em um arquivo, uma por linha e use
grep -f that-file ...