2010-09-28 15 views
22

Tengo miles de archivos PNG que me gusta hacer más pequeños con pngcrush. Tengo un trabajo simple find .. -exec, pero es secuencial. Mi máquina tiene bastantes recursos y yo haría esto en paralelo.Haciendo procesamiento paralelo en bash?

La operación a realizar en cada PNG es:

pngcrush input output && mv output input 

Lo ideal sería que se puede especificar el número máximo de operaciones en paralelo.

¿Hay una manera de hacer esto con bash y/u otros ayudantes de concha? Soy Ubuntu o Debian.

Respuesta

35

Puede utilizar xargs ejecutar varios procesos en paralelo:

find /path -print0 | xargs -0 -n 1 -P <nr_procs> sh -c 'pngcrush $1 temp.$$ && mv temp.$$ $1' sh 

xargs leerá la lista de los archivos producidos por find (separados por 0 personajes (-0)) y ejecute el comando proporcionado (sh -c '...' sh) con un parámetro a la vez (-n 1). xargs ejecutará <nr_procs> (-P <nr_procs>) en paralelo.

+0

'$ 1' no se rellena, también lo intenté con un ejemplo mínimo sin suerte. xargs es 4.4.0, ¿alguna idea? – mark

+0

Olvidé especificar el valor por $ 0. Debería ser arreglado ahora. –

+0

confirmado, funciona! ¿Podría por favor editar su respuesta también? – mark

11

Se puede utilizar a medida find/xargs soluciones (véase la respuesta Bart Sas'), pero cuando las cosas se hacen más complejos que tiene -al menos- dos potentes opciones:

  1. parallel (de paquete) moreutils
  2. GNU parallel
+2

Paquetes Deb y RPM: https://build.opensuse.org/package/show?package=parallel&project=home%3Atange –

+4

Recomiendo encarecidamente GNU en paralelo sobre la versión moreutils. Es mucho más flexible. –

+3

find/path -print0 | paralelo -0 pngcrush {} {.}. temp '&&' mv {.}. temp {} –

Cuestiones relacionadas