Выполнение параллельной обработки в bash?
У меня есть тысячи png файлов, которые мне нравится делать меньше с pngcrush
. У меня простое задание find .. -exec
, но оно последовательное. У моей машины достаточно ресурсов, и я бы сделал это параллельно.
Операция, выполняемая для каждого png:
pngcrush input output && mv output input
В идеале я могу указать максимальное количество параллельных операций.
Есть ли способ сделать это с помощью bash и/или других помощников оболочки? Я Ubuntu или Debian.
Ответы
Ответ 1
Вы можете использовать xargs
для параллельного запуска нескольких процессов:
find /path -print0 | xargs -0 -n 1 -P <nr_procs> sh -c 'pngcrush $1 temp.$$ && mv temp.$$ $1' sh
xargs
будет считывать список файлов, созданных find (разделенных 0 символами (-0
)) и запускать предоставленную команду (sh -c '...' sh
) с одним параметром за раз (-n 1
). xargs будет запускать <nr_procs>
(-P <nr_procs>
) параллельно.
Ответ 2
Вы можете использовать пользовательские решения find/xargs
(см. ответ Барта Саса), но когда ситуация становится более сложной, у вас есть - по меньшей мере два мощных варианта:
Ответ 3
С GNU Parallel http://www.gnu.org/software/parallel/ это можно сделать следующим образом:
find /path -print0 | parallel -0 pngcrush {} {.}.temp '&&' mv {.}.temp {}
Подробнее: