使用 sha256sum 检查校验和时如何显示进度

使用 sha256sum 检查校验和时如何显示进度

检查大文件的 SHA256 校验和时如何显示进度?当我sha256sum -c SHA256SUMS在文件SHA256SUMS包含大文件的校验和的地方执行操作时,没有指示该命令何时可能完成。有没有办法在做的时候显示进度sha256sum -c ...

答案1

sha256sum属于 GNU Coreutils。其中大多数都缺少--progressstatus=progress选项(最近版本dd提供了一个但sha256sum没有,参见git 日志

解决方法:

  1. 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 
    

    如果您被允许安装它,它会提供您正在搜索的内容。它应该打包在所有主要发行版上,但通常是不是默认安装,尤其是在最小安装时。

  2. 最后一招: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以便我将来可以轻松地重复使用它。您还可以使用其他管道进度指示器!

相关内容