- Вопрос или проблема
- Этот метод использует progress и, возможно, xterm, которые необходимо установить.
- Этот метод является обходным решением, для которого необходимо установить pv и espeak.
- Этот метод использует curl
- Ответ или решение
- 1. Использование утилиты progress
- 2. Использование pv (Pipe Viewer)
- 3. Использование curl
- 4. Исполнение в отдельном окне терминала с xterm
- Заключение
Вопрос или проблема
Как показать процесс при проверке SHA256 контрольных сумм больших файлов? Когда я выполняю sha256sum -c SHA256SUMS
, где файл SHA256SUMS
содержит контрольную сумму для большого файла, нет никаких указаний на то, когда команда может завершиться. Есть ли способ показать прогресс при выполнении sha256sum -c ...
?
sha256sum
входит в состав GNU Coreutils. У большинства из них отсутствует опция --progress
или status=progress
(недавние версии dd
предоставляют такую опцию, но sha256sum
— нет, см. git log)
Решения обходного пути:
-
Есть
progress -w
(Просмотрщик Прогресса Coreutils). Его можно запустить как фоновый процесс (или во втором терминале, например,progress -w -m
):$ progress -w & sha256sum -c Fedora-Workstation-36-1.5-x86_64-CHECKSUM.txt [2] 58536 [58537] sha256sum /home/user/Downloads/Fedora-Workstation-Live-x86_64-36-1.5.iso 20.7% (398.1 MiB / 1.9 GiB) 383.3 MiB/s осталось 0:00:03
Если вам разрешено установить его, он предоставляет то, что вы ищете. Он должен быть упакован во всех основных дистрибутивах, но обычно не установлен по умолчанию, особенно в минимальных установках.
-
Последний вариант:
pv
. К сожалению, он не заменяет функциональностьsha256sum -c
(поскольку не поддерживает несколько файлов и не сравнивает что-то автоматически), но вы определенно можете использоватьpv
для передачи файла вsha256sum
:$ pv Fedora-Workstation-Live-x86_64-35-1.2.iso | sha256sum 159GiB 0:00:04 [ 411MiB/s] [============================> ] 85% ETA 0:00:02
По умолчанию, опции
-p
и-e
должны быть активными (т.е. они дают вам индикатор прогресса и предполагаемое время до завершения).pv
должен быть упакован для всех основных дистрибутивов и обычно устанавливается по умолчанию, даже в минимальных версиях.
Этот метод использует progress
и, возможно, xterm
, которые необходимо установить.
sha256sum -c SHA256SUMS & pid=$! ; xterm -e progress -mp $pid 2>/dev/null
Прогресс выводится в отдельное окно (конечно, должен быть графический рабочий стол). В противном случае
sha256sum -c SHA256SUMS & progress -mp $!
также сработает, но он перезаписывает вывод, например, подтверждение OK
, которое вы хотели бы видеть (а не только быстро мигало). Таким образом, без использования отдельного окна, вместо того чтобы получать непрерывные обновления прогресса, лучше всего использовать одно единственное оценочное время, остающееся до завершения, как предложено в ответе Андреаса Хертера,
$ progress -w & sha256sum -c SHA256SUMS
[6] 9930
[ 9931] sha256sum /media/multimed-2/CD/ubuntu/22.04/ubuntustudio-22.04-dvd-amd64.iso
5.1% (217.8 MiB / 4.1 GiB) 212.4 MiB/s осталось 0:00:18
ubuntustudio-22.04-dvd-amd64.iso: OK
Я добавил фикс через временный файл, который улучшает второй метод, чтобы избежать перезаписи вывода OK
, что также полезно для файла контрольных сумм с несколькими довольно крупными файлами,
md5sum -c md5sum.txt > /tmp/mytmp & progress -mp $! ; cat /tmp/mytmp
(Этот последний фикс был проверен в моей директории с несколькими сжатыми образами файлов и соответствующими md5sums, отсюда переключение с sha256sum, но синтаксис остается тем же.)
Этот метод является обходным решением, для которого необходимо установить pv
и espeak
.
Это обходное решение для sha256sum -c
. Сначала вам нужно извлечь соответствующую контрольную сумму из файла контрольных сумм и использовать ее в качестве второго параметра.
Вы можете пропустить espeak
, если не хотите громкого предупреждения при наличии несоответствия.
Shellscript sha256check-pv
:
#! /bin/bash
namesum=$(basename $0)
namesum=${namesum/check/sum}
namesum=${namesum/-pv}
#echo $namesum
if [ "$2" == "" ]
then
echo "Используйте: $0 <файл> <$namesum>"
exit
fi
calcsum=$(pv "$1" | "$namesum" | cut -d " " -f1)
chksum="${2,,}"
echo "вычисленная $namesum=$calcsum"
echo "должен быть $namesum=$chksum"
if [ "$calcsum" == "$chksum" ]
then
echo "$0 указывает на УСПЕШНУЮ загрузку :-)"
else
echo ":-( $0 указывает на НЕУСПЕШНУЮ загрузку :-("
espeak -p 65 -s 120 -k10 -a 150 "Загрузка не удалась" >/dev/null 2>/dev/null
fi
Примеры:
Используя корректно загруженный файл и правильную контрольную сумму:
$ sha256check-pv ubuntustudio-22.04-dvd-amd64.iso 66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a2
4,14GiB 0:00:19 [ 212MiB/s] [========================================================================>] 100%
вычисленная sha256sum=66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a2
должен быть sha256sum=66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a2
/home/sudodus/bin/sha256check-pv указывает на УСПЕШНУЮ загрузку :-)
и когда я изменяю последнюю цифру в контрольной сумме
$ sha256check-pv ubuntustudio-22.04-dvd-amd64.iso 66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a1
4,14GiB 0:00:19 [ 212MiB/s] [========================================================================>] 100%
вычисленная sha256sum=66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a2
должен быть sha256sum=66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a1
:-( /home/sudodus/bin/sha256check-pv указывает на НЕУСПЕШНУЮ загрузку :-(
Это было протестировано на MacOS 10.15.7 с использованием оболочки bash. Другие оболочки и другие версии MacOS также должны работать, но могут не сработать.
sha256sum принимает стандартный ввод, поэтому вы можете передать файл через pv
или какой-либо другой фильтр для проверки прогресса:
cat some_long_file_you_want_progress_on | pv | sha256sum
Согласно странице руководства, “pv принимает множество опций, которые делятся на переключатели отображения, модификаторы вывода и общие опции.”
Поскольку переданные данные не имеют представления о том, насколько они длинные, если вы хотите получить процент завершения (вместо простой бессмысленной анимации), вам придется найти размер файла. Если вы знаете размер вашего файла, вы можете использовать переключатель “-s” для pv:
cat some_long_file_you_want_progress_on | pv -s 12345 | sha256sum
Если вы собираетесь делать это часто, вы можете сделать это функцией оболочки, чтобы она могла определить размер файла:
function sha_prog {
cat $1 | pv -s $(du -sb $1 | awk '{print $1}') | sha256sum
}
Теперь, если вы вводите sha_prog some_long_file_you_want_progress_on
, вы получите анимацию процента завершения по мере выполнения.
Это запускает конвейер с содержимым первого аргумента функции (“some_long_file_you_want_progress_on”), передает его в pv -s
с размером файла (du
), а затем передает его в sha256sum
.
Обратите внимание, что '{print $1}'
защищено одинарными кавычками, так что $1 не заменяется именем файла; фактически символы “$1” передаются в awk
, который интерпретирует их как первый токен во входе, поскольку du
выводит как размер файла, так и его имя в стандартный вывод.
Я протестировал это и нашел это достаточно полезным, чтобы добавить в мой ~/.bashrc
, чтобы я мог легко использовать это в будущем. Существует и другие индикаторы прогресса для конвейера, которые вы также можете использовать!
Этот метод использует curl
curl
может читать файлы с диска с использованием схемы URI file:///
:
Shellscript check.sh
:
#!/bin/sh
curl --progress-bar --output - "file://$(realpath $1)" | sha256sum | sed "s|-|$1|g"
Пример:
$ ./check.sh debian-12.7.0-mipsel-netinst.iso
################################################################################# 100.0%
9853e5ec01575da125c34ad02659378f2508b5797be718f51e9dc0d9e738c863 debian-12.7.0-mipsel-netinst.iso
$ cat SHA256SUMS
9853e5ec01575da125c34ad02659378f2508b5797be718f51e9dc0d9e738c863 debian-12.7.0-mipsel-netinst.iso
$ ./check.sh debian-12.7.0-mipsel-netinst.iso | diff SHA256SUMS -
################################################################################# 100.0%
$ echo $?
0
Ответ или решение
Чтобы показать прогресс при проверке контрольных сумм с использованием sha256sum
, вы можете воспользоваться несколькими альтернативными методами, поскольку сам sha256sum
не имеет встроенной функции отображения прогресса. Вот несколько решений:
1. Использование утилиты progress
Утилита progress
может помочь отслеживать процесс выполнения команды sha256sum
. Вы можете запустить sha256sum
в фоновом режиме и в другой консоли запустить progress
, чтобы видеть прогресс:
progress -w & sha256sum -c SHA256SUMS
Если у вас установлен графический интерфейс, вы можете открывать progress
в новом терминале. Этот способ особенно полезен, если вы проверяете контрольные суммы для больших файлов.
2. Использование pv
(Pipe Viewer)
pv
можно использовать для отображения прогресса при вычислении контрольных сумм, но для этого потребуется немного изменить ваш подход:
pv < ваш_файл.iso | sha256sum
Также можно использовать опцию -s
, чтобы указать размер файла:
pv -s 4.1G < ваш_файл.iso | sha256sum
Если вы хотите создать функцию для удобства, можно добавить следующее в ваш .bashrc
:
function sha_prog {
cat $1 | pv -s $(du -sb $1 | awk '{print $1}') | sha256sum
}
Теперь вы можете использовать эту функцию для вычисления контрольной суммы с отображением прогресса:
sha_prog ваш_файл.iso
3. Использование curl
Если вы хотите также получать прогресс, можете воспользоваться curl
, который поддерживает отображение прогресса:
#!/bin/sh
curl --progress-bar --output - "file://$(realpath $1)" | sha256sum | sed "s|-|$1|g"
Сохраните этот скрипт как check.sh
и дайте ему права на выполнение. Затем вызовите его с файлом, для которого нужно проверить контрольную сумму:
./check.sh ваш_файл.iso
4. Исполнение в отдельном окне терминала с xterm
Если у вас есть доступ к графической среде, вы можете использовать xterm
для отображения прогресса. Пример команды:
sha256sum -c SHA256SUMS & pid=$! ; xterm -e progress -mp $pid 2>/dev/null
Эта команда запустит sha256sum
в фоновом режиме и будет отображать прогресс в новом окне xterm
.
Заключение
Из-за того, что sha256sum
не предоставляет собственного индикатора прогресса, вышеописанные методы позволяют обойти это ограничение. Убедитесь, что у вас установлены необходимые утилиты (progress
, pv
, curl
) и используйте тот метод, который больше всего подходит вашей рабочей среде и задачам.