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 ...