Этот вопрос объединяет два отдельных классабайтовых единиц , а именно десятичныеG гигабайты и двоичныеGi бибайты:
Prefixes for multiples of
bits (bit) or bytes (B)
Decimal Binary
Value SI Value IEC
1000 10^3 k kilo 1024 2^10 Ki kibi
1000^2 10^6 M mega 1024^2 2^20 Mi mebi
1000^3 10^9 G giga 1024^3 2^30 Gi gibi
Команда free -h
печатаетгибибайт, тогда как free -b
печатает байт . Выполняя математику, (сначала добавляйте суффикс 0
к количеству байтов, чтобы компенсировать ошибку free
, отмеченную в ответе Стивена Китта ):
echo $(( 16411549690 / (10**9) )) # gigabytes
echo $(( 16411549690 / (2**30) )) # gibibytes
Выходы:
16
15
Продавцы жестких дисков использовали эту распространенную путаницу, и один поставщик даже оказался в проигрыше в коллективном иске. См. Orin Safier против Western Digital Corporation , в котором недовольным покупателям в 2006 году было присуждено 30 долларов за программное обеспечение для резервного копирования, а не настоящие деньги, каждому за их проблемы.
Для распараллеливания файлов можно использовать GNU Parallel:
parallel sha256sum ::: *
Распараллеливание хеширования для одного файла можно выполнить с помощью определенных хеш-функций, использующих дерево Меркла. b3sum
является таким инструментом.
В качестве альтернативы вы можете перейти на ЦП, который поддерживает аппаратные вычисления SHA256, такие как более новые ЦП Intel или AMD. Мой Ryzen 3700X невероятно быстро вычисляет хеш-суммы SHA256, намного быстрее, чем вычисление MD5, который является гораздо более простым алгоритмом. Проверьте sha_ni
в /proc/cpuinfo
.
В качестве альтернативы вы можете использовать Blake3 , который намного (почти в 15 раз)быстрее , даже если реализован чисто программно:
xargs
имеет опцию -P
для параллельного запуска нескольких заданий. Она далеко не так гибка, как программа Оле Танге parallel
, но подходит для большинства простых задач распараллеливания.
Например:
find. -name '*.mp4' -print0 | xargs -0r -n 1 -P 0 openssl dgst -sha256
-P 0
указывает xargs запускать как можно больше заданий параллельно (например. на моем 32-поточном Threadripper 1950x он будет выполнять 32 openssl
заданий параллельно)
-n 1
указывает xargs запускать каждое задание только с одним аргументом. В то время как 1 задание является под-оптимальным для openssl dgst
, которое может обрабатывать много имен файлов в командной строке, вы почти всегда будете использовать опцию-n
(или-L
)с xargs -P
.
В противном случае он попытается вписать в каждую командную строку как можно больше аргументов -, что обычно приводит к одному заданию, если только у вас не много десятков тысяч аргументов. В Linux ограничение длины командной строки обычно составляет 2 миллиона символов, 2097152 (проверьте с помощьюgetconf ARG_MAX
). Это позволяет использовать много имен файлов.
Оптимальным будет подсчитать, сколько у вас есть аргументов, и разделить полученное значение на количество заданий, которые вы хотите выполнять параллельно. например.
t=32
numfiles=$(find.//. -name '*.mp4' | grep -c //)
let n=numfiles/t
find. -name '*.mp4' -print0 | xargs -0r -n "$n" -P "$t" openssl dgst -sha256
Примечание:-P
не является стандартной опцией POSIX для xargs. Требуется GNU или *BSD xargs. Возможно и другие версии.