Hay dos soluciones fáciles para esto. Básicamente, usando xargs
o parallel
.
Enfoque xargs:
Puede usar xargs
con find
lo siguiente:
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
Donde lo reemplazará number_of_processes
por el número máximo de procesos que desea iniciar. Sin embargo, esto no garantiza un rendimiento significativo en caso de que su rendimiento sea limitado de E / S. En ese caso, puede intentar iniciar más procesos para compensar el tiempo perdido esperando E / S.
Además, con la inclusión de find, puede especificar opciones más avanzadas en lugar de solo patrones de archivo, como el tiempo de modificación, etc.
Un posible problema con este enfoque, como lo explican los comentarios de Stéphane, si hay pocos archivos, xargs
puede no iniciar suficientes procesos para ellos. Una solución será usar la -n
opción para xargs
especificar cuántos argumentos debería tomar de la tubería a la vez. La configuración -n1
obligará xargs
a iniciar un nuevo proceso para cada archivo individual. Este podría ser un comportamiento deseado si los archivos son muy grandes (como en el caso de esta pregunta) y hay un número relativamente pequeño de archivos. Sin embargo, si los archivos mismos son pequeños, la sobrecarga de iniciar un nuevo proceso puede socavar la ventaja del paralelismo, en cuyo caso un -n
valor mayor será mejor. Por lo tanto, la -n
opción podría ajustarse de acuerdo con el tamaño y el número del archivo.
Enfoque Paralelo:
Otra forma de hacerlo es usar la herramienta paralela Ole Tange GNU parallel
(disponible aquí ). Esto ofrece un mayor control de grano fino sobre el paralelismo e incluso se puede distribuir en varios hosts (sería beneficioso si su directorio se comparte, por ejemplo). La sintaxis más simple usando paralelo será:
find . -type f | parallel -j+1 grep mypattern
donde la opción -j+1
indica en paralelo que se inicie un proceso que exceda el número de núcleos en su máquina (Esto puede ser útil para tareas limitadas de E / S, incluso puede intentar aumentar su número).
Paralelo también tiene la ventaja xargs
de retener realmente el orden de salida de cada proceso y generar una salida contigua. Por ejemplo, con xargs
, si el proceso 1 genera una línea p1L1
, digamos , el proceso 2 genera una línea p2L1
, el proceso 1 genera otra línea p1L2
, la salida será:
p1L1
p2L1
p1L2
mientras que con parallel
la salida debe ser:
p1L1
p1L2
p2L1
Esto suele ser más útil que la xargs
salida.