Я часто пишу просто для петли, чтобы выполнить операцию много файлов, например:Easy параллелизм
for i in `find . | grep ".xml$"`; do bzip2 $i; done
Это кажется немного удручает, что на моей 4-ядерной машине только одно ядра привыкает. . Есть ли простой способ добавить параллелизм в мой сценарий оболочки?
EDIT: Чтобы представить немного больше контекста для моих проблем, жаль, что я не был более ясен, чтобы начать с!
Я часто хочу запускать простые (иш) сценарии, такие как график графика, сжимать или распаковывать или запускать некоторую программу на наборах данных разумного размера (обычно от 100 до 10000). Сценарии, которые я использую для решения таких проблем, выглядят как выше, но могут иметь другую команду или даже последовательность команд для выполнения.
Например, только сейчас я бегу:
for i in `find . | grep ".xml.bz2$"`; do find_graph -build_graph $i.graph $i; done
Так что мои проблемы никак не BZIP конкретны! (Хотя параллельный bzip выглядит круто, я намерен использовать его в будущем).
Просто примечание, но вы можете использовать xargs, чтобы не писать такой цикл: найти. | grep ".xml.bz2 $" | xargs -n1 bzip2 (-n1 говорит только об отправке каждого аргумента bzip 1, по умолчанию xargs передает все в один процесс). К сожалению, xargs выполняет каждый процесс последовательно. – 2008-11-11 20:29:34
Вы должны делать `find. -name \ *. xml.bz2` вместо `find. | grep ".xml.bz2 $" `- это именно то, что нужно для поиска! (Кроме того, ваше регулярное выражение будет соответствовать именам файлов, например foozxmlzbz, но это другая и несущественная проблема). – 2008-11-11 20:42:58
Ждите Эвана, у xargs есть аргумент, обозначенный «-P» для меня, для количества процессов! So: найти. | grep ".xml.bz2 $" | xargs -n1 -P3 bzip2 делает то, что я хочу Как долго имеет xargs, что для ?? – 2008-11-11 21:50:59