2010-09-28 18 views
22

Ho migliaia di file PNG che mi piace rendere più piccoli con pngcrush. Ho un semplice lavoro find .. -exec, ma è sequenziale. La mia macchina ha un bel po 'di risorse e lo farei in parallelo.Esegue l'elaborazione parallela in bash?

L'operazione da eseguire su ogni png è:

pngcrush input output && mv output input 

Idealmente mi possibile specificare il numero massimo di operazioni parallele.

C'è un modo per farlo con bash e/o altri helper di shell? Sono Ubuntu o Debian.

risposta

35

È possibile utilizzare xargs per eseguire più processi in parallelo:

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

xargs leggerà l'elenco dei file prodotti da find (separati da 0 caratteri (-0)) ed eseguire il comando in dotazione (sh -c '...' sh) con un parametro alla volta (-n 1). xargs eseguirà <nr_procs> (-P <nr_procs>) in parallelo.

+0

'$ 1' non viene popolato, l'ho provato anche con un esempio minimo senza fortuna. xargs è 4.4.0, qualche idea? – mark

+0

Ho dimenticato di specificare il valore per $ 0. Dovrebbe essere risolto ora. –

+0

confermato, funziona! Potresti modificare anche la tua risposta? – mark

11

È possibile utilizzare personalizzato find/xargs soluzioni (vedi risposta Bart Sas'), ma quando le cose diventano più complesse avete -A ai minimi di due potenti opzioni:

  1. parallel (dal pacchetto moreutils)
  2. GNU parallel
+2

Pacchetti deb e RPM: https://build.opensuse.org/package/show?package=parallel&project=home%3Atange –

+4

Consiglio vivamente il parallelo GNU sulla versione moreutils. È molto più flessibile –

+3

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