¿Cómo maneja el problema "Demasiados archivos" cuando trabaja en Bash?

Muchas veces tengo que trabajar con directorios que contienen cientos de miles de archivos, haciendo coincidencias de texto, reemplazando, etc. Si voy por la ruta estándar de, digamos

grep foo *

Recibo demasiados mensajes de error, así que termino haciendo

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

o

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

Pero estos son menos que óptimos (cree un nuevo proceso grep para cada archivo).

Esto parece más una limitación en el tamaño de los argumentos que los programas pueden recibir, porque el * en el bucle for funciona bien. Pero, en cualquier caso, ¿cuál es la forma correcta de manejar esto?

PD: No me digas que haga grep -r en su lugar, lo sé, estoy pensando en herramientas que no tienen una opción recursiva.

Respuestas a la pregunta(5)

Su respuesta a la pregunta