Вам также потребуется изменить файл sudoers
:
Defaults env_keep += "SYSTEMD_PAGER"
Используя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
С помощью 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 параллельно.