a menudo me encuentro escribiendo simple para bucles para llevar a cabo una operación para muchos archivos, por ejemplo:Fácil paralelización
for i in `find . | grep ".xml$"`; do bzip2 $i; done
Me parece un poco deprimente que en mi máquina de 4 núcleos solo núcleo se está acostumbrando. ¿Existe alguna manera fácil de agregar paralelismo a mis scripts de shell?
EDITAR: Para introducir un poco más de contexto a mis problemas, lo siento, no estaba más claro para empezar!
A menudo quiero ejecutar scripts simples (ish), como trazar un gráfico, comprimir o descomprimir, o ejecutar algún programa, en conjuntos de datos de tamaño razonable (generalmente entre 100 y 10.000). Los scripts que uso para resolver estos problemas se parecen al anterior, pero pueden tener un comando diferente, o incluso una secuencia de comandos para ejecutar.
Por ejemplo, ahora mismo estoy corriendo:
for i in `find . | grep ".xml.bz2$"`; do find_graph -build_graph $i.graph $i; done
Así que mis problemas son de ninguna manera específica bzip! (Aunque el bzip paralelo se ve bien, tengo la intención de usarlo en el futuro).
Solo una nota, pero puede usar xargs para no tener que escribir un ciclo como ese: buscar. | grep ".xml.bz2 $" | xargs -n1 bzip2 (el -n1 dice que solo pasa cada argumento de bzip 1, por defecto xargs pasa todo a un solo proceso). Lamentablemente, xargs hace cada proceso en serie. –
Deberías hacer 'encontrar. -name \ *. xml.bz2' en lugar de 'encontrar. | grep ".xml.bz2 $" '- ¡eso es precisamente para lo que es encontrar! (Además, su expresión regular coincidirá con nombres de archivos como foozxmlzbz, pero ese es un problema diferente y sin importancia). –
Espera Evan, xargs tiene un argumento marcado "P" para mí, para la cantidad de procesos. Entonces: encontrar. | grep ".xml.bz2 $" | xargs -n1 -P3 bzip2 hace lo que quiero ¿Cuánto tiempo tiene xargs para eso? –