检查大文件的 SHA256 校验和时如何显示进度?当我sha256sum -c SHA256SUMS
在文件SHA256SUMS
包含大文件的校验和的地方执行操作时,没有指示该命令何时可能完成。有没有办法在做的时候显示进度sha256sum -c ...
?
答案1
sha256sum
属于 GNU Coreutils。其中大多数都缺少--progress
或status=progress
选项(最近版本dd
提供了一个但sha256sum
没有,参见git 日志)
解决方法:
有
progress -w
(Coreutils 进度查看器)。它可以作为后台进程运行(或在第二个终端中与 结合使用watch
,例如watch progress -w
):$ 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 remaining 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
应该为所有主要发行版打包,并且通常默认安装,即使在最小发行版上也是如此。
答案2
此方法使用progress
,也许xterm
需要安装。
sha256sum -c SHA256SUMS & pid=$! ; xterm -e progress -mp $pid 2>/dev/null
进度被写入一个单独的窗口(当然必须有图形桌面)。否则
sha256sum -c SHA256SUMS & progress -mp $!
也可以工作,但它会覆盖输出,例如OK
您希望看到的确认(不仅仅是快速闪过)。因此,在不使用单独的窗口的情况下,最好对剩余时间进行一次估计,而不是不断更新进度,这在 Andreas Haerter 的答案中建议,
$ 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 remaining 0:00:18
ubuntustudio-22.04-dvd-amd64.iso: OK
我通过临时文件添加了一个修复程序,这使得第二种方法更好,以避免覆盖输出OK
,对于具有几个相当大的文件的校验和文件也很有用,
md5sum -c md5sum.txt > /tmp/mytmp & progress -mp $! ; cat /tmp/mytmp
(这个最新的修复程序在我的目录中使用几个压缩图像文件和相应的 md5sum 进行了测试,因此从 sha256sum 切换,但语法是相同的。)
此方法是一种解决方法,需要pv
安装espeak
。
这是 的一个解决方法sha256sum -c
。首先必须从校验和文件中提取相关校验和并将其用作第二个参数。
espeak
如果您不想在不匹配时发出响亮的警告,则可以跳过。
外壳脚本sha256check-pv
:
#! /bin/bash
namesum=$(basename $0)
namesum=${namesum/check/sum}
namesum=${namesum/-pv}
#echo $namesum
if [ "$2" == "" ]
then
echo "Usage: $0 <file> <$namesum>"
exit
fi
calcsum=$(pv "$1" | "$namesum" | cut -d " " -f1)
chksum="${2,,}"
echo "calculated $namesum=$calcsum"
echo "should be $namesum=$chksum"
if [ "$calcsum" == "$chksum" ]
then
echo "$0 indicates SUCCESSFUL download :-)"
else
echo ":-( $0 indicates FAILED download :-("
espeak -p 65 -s 120 -k10 -a 150 "Download failed" >/dev/null 2>/dev/null
fi
例子:
使用正确下载的文件和正确的校验和:
$ sha256check-pv ubuntustudio-22.04-dvd-amd64.iso 66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a2
4,14GiB 0:00:19 [ 212MiB/s] [========================================================================>] 100%
calculated sha256sum=66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a2
should be sha256sum=66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a2
/home/sudodus/bin/sha256check-pv indicates SUCCESSFUL download :-)
当我更改校验和中的最后一位数字时
$ sha256check-pv ubuntustudio-22.04-dvd-amd64.iso 66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a1
4,14GiB 0:00:19 [ 212MiB/s] [========================================================================>] 100%
calculated sha256sum=66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a2
should be sha256sum=66a6c7e54c41e39b5e671cea65f3af635c26aa7c3b6983d8785970988a9ec0a1
:-( /home/sudodus/bin/sha256check-pv indicates FAILED download :-(
答案3
这已在 MacOS 10.15.7 上使用 bash shell 进行了测试。其他 shell 和其他版本的 MacOS 也应该可以工作,但也可能不行。
sha256sum 接受标准输入,因此您可以通过管道pv
或其他一些进度检查过滤器传输文件:
cat some_long_file_you_want_progress_on | pv | sha256sum
根据手册页,“pv 有很多选项,分为显示开关、输出修饰符和常规选项。”
因为管道数据不知道它有多长,所以如果您想要完成的百分比(而不仅仅是一些无意义的动画),您必须提出文件大小。如果您知道文件的大小,则可以使用 pv 的“-s”开关:
cat some_long_file_you_want_progress_on | pv -s 12345 | sha256sum
如果您要经常这样做,可以将其设为 shell 函数,这样它就可以计算出文件的大小:
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
以便我将来可以轻松地重复使用它。您还可以使用其他管道进度指示器!