Делаете параллельную обработку в bash? - PullRequest
22 голосов
/ 28 сентября 2010

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

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

pngcrush input output && mv output input

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

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

Ответы [ 3 ]

35 голосов
/ 28 сентября 2010

Вы можете использовать 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>) параллельно.

11 голосов
/ 28 сентября 2010

Вы можете использовать пользовательские решения find/xargs (см. Ответ Барта Саса), но когда все становится сложнее, у вас есть, по крайней мере, два мощных варианта:

  1. parallel (из пакета moreutils )
  2. GNU параллельно
1 голос
/ 13 августа 2014

С 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).Ваша командная строка будет любить вас за это.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...