Подтвердить что ты не робот

Выполнение параллельной обработки в bash?

У меня есть тысячи png файлов, которые мне нравится делать меньше с pngcrush. У меня простое задание find .. -exec, но оно последовательное. У моей машины достаточно ресурсов, и я бы сделал это параллельно.

Операция, выполняемая для каждого png:

pngcrush input output && mv output input

В идеале я могу указать максимальное количество параллельных операций.

Есть ли способ сделать это с помощью bash и/или других помощников оболочки? Я Ubuntu или Debian.

4b9b3361

Ответ 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 {} 

Подробнее:

  • Смотрите видеоролик для быстрого введения: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
  • Пройдите через учебник (man parallel_tutorial). Вы в командной строке будет любить вас за это.