Como você lida com o problema “Too many files” ao trabalhar no Bash?

Eu muitas vezes tenho que trabalhar com diretórios contendo centenas de milhares de arquivos, fazendo correspondência de texto, substituindo e assim por diante. Se eu for a rota padrão de, digamos

grep foo *

Eu recebo a mensagem de erro de muitos arquivos, então eu acabo fazendo

for i in *; do grep foo $i; done

ou

find ../path/ | xargs -I{} grep foo "{}"

Mas estes são menos que ótimos (crie um novo processo de grep para cada arquivo).

Isso parece mais uma limitação no tamanho dos argumentos que os programas podem receber, porque o * no loop for funciona bem. Mas, em todo caso, qual é a maneira correta de lidar com isso?

PS: Não me diga para fazer grep -r em vez disso, eu sei sobre isso, estou pensando em ferramentas que não têm uma opção recursiva.

questionAnswers(5)

yourAnswerToTheQuestion