Как мне использовать GNU parallel для вычисления хэша sha256?

Вам также потребуется изменить файл sudoers:

 Defaults        env_keep += "SYSTEMD_PAGER"
8
09.12.2019, 15:22
2 ответа

Используяxargs(и предполагая, что у вас есть реализация этой утилиты, которая поддерживает -0и-P):

printf '%s\0' * | xargs -0 -L 1 -P 16 sh -c 'sha256sum "$1" > "$1".sha' sh

Это передаст все имена в текущем каталоге как список с нулевым -завершением в xargs. Утилита xargsвызовет скрипт в строке -shдля каждого из этих имен, запуская не более 16 одновременных процессов. Строковый скрипт in -принимает аргумент и запускает sha256sumдля него, выводя результат в файл с таким же именем.

Обратите внимание, что при этом также могут быть получены .shaфайлы, созданные при предыдущем запуске того же конвейера. Чтобы избежать этого, используйте несколько более сложный шаблон, чем *, для сопоставления с конкретными именами, которые вы хотите обработать. Например, вbash:

shopt -s extglob
printf '%s\0' !(*.sha) | xargs...as above...

Также обратите внимание, что параллельная работа sha256sumс большими файлами, скорее всего, будет связана с диском, а не с процессором, и что вы можете увидеть аналогичную скорость работы с меньшим количеством параллельных задач.


Для эквивалента GNU parallel:замените xargsна parallel.


В оболочке zshэто можно сделать как

autoload -U zargs
setopt EXTENDED_GLOB

zargs -P 16 -L 1 -- (^(*.sha)) -- sh -c 'sha256sum "$1" > "$1".sha' sh
8
27.01.2020, 20:10

С помощью GNU parallelвы можете полностью избежать цикла оболочки и просто запустить:

parallel -P 16 sha256sum {} ">"{}.sha ::: *

Это будет выполняться sha256sumдля каждого файла (или каталога, но это то, что сделал ваш скрипт ), возвращаемый glob *и сохраняющий вывод в fileName.sha. Например:

$ ls
file1  file2  file3  file4  file5
$ parallel -P 16 sha256sum {} ">"{}.sha ::: *
$ ls
file1      file2      file3      file4      file5
file1.sha  file2.sha  file3.sha  file4.sha  file5.sha

Однако имейте в виду, что @Kusalandanda указал на то, что основным узким местом в таких вещах является ввод-вывод, а не обязательно ЦП. Возможно, вы захотите запустить менее 16 параллельно.

7
27.01.2020, 20:10

Теги

Похожие вопросы