将 pv 与 md5sum 一起使用

Emm*_*maV 6 pipe hashsum pv

我曾经md5sumpv检查是在同一个目录中的文件的4吉布:

md5sum dir/* | pv -s 4g | sort
Run Code Online (Sandbox Code Playgroud)

该命令在大约 28 秒内成功完成,但pv的输出全是错误的。这是在整个过程中显示的那种输出:

219 B 0:00:07 [ 125 B/s ] [>                                ]  0% ETA 1668:01:09:02
Run Code Online (Sandbox Code Playgroud)

没有-s 4g和也是这样| sort。我也尝试过使用不同的文件。

我试过使用pvwithcat并且输出很好,所以问题似乎是由md5sum.

Kus*_*nda 11

pv实用程序是“花哨的cat”,这意味着您可以pv在大多数情况下使用cat.

使用catwith md5sum,您可以计算单个文件的 MD5 校验和

cat file | md5sum
Run Code Online (Sandbox Code Playgroud)

或者,用pv

pv file | md5sum
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不允许md5sum将文件名正确插入到其输出中。

现在,幸运的是,它pv是一个非常漂亮的cat,并且在某些系统(Linux)上,它能够观察通过另一个进程传递的数据。这是通过将其-d选项与其他进程的进程 ID 一起使用来完成的。

这意味着你可以做这样的事情

md5sum dir/* | sort >sums &
sleep 1
pv -d "$(pgrep -n md5sum)"
Run Code Online (Sandbox Code Playgroud)

这将允许pv观看md5sum过程。该sleep是有允许md5sum,它在后台运行,正常启动。 pgrep -n md5sum将返回md5sum您拥有的最近启动的进程的 PID 。pv一旦它正在监视的进程终止,它将退出。

我已经pv多次测试过这种特殊的运行方式,它似乎通常运行良好,但有时似乎在md5sum切换到下一个文件时停止输出任何内容。有时,它似乎会在 shell 中产生虚假的后台任务。

运行它可能是最安全的

md5sum dir/* >sums &
sleep 1
pv -W -d "$!"
sort -o sums sums
Run Code Online (Sandbox Code Playgroud)

-W选项将导致pv等待直到实际数据被传输,尽管这似乎并不总是可靠地工作。


ozz*_*zzy 5

您通过管道输入的数据md5sum不是正在处理的文件的数据,而是md5sum输出,对于每个文件,输出由一行组成,包括:MD5 哈希、两个空格和文件名。由于我们事先知道这一点pv,因此可以相应地通知,从而使其能够显示准确的进度指示器。有两种方法可以这样做。

第一种首选方法(由frostschutz 建议)利用了为md5sum每个处理的文件生成一行的事实,以及pv具有计算行数而不是字节数的行模式这一事实。在这种模式下,pv只会在吞吐量中遇到换行符时移动进度条,即每个文件完成md5sum. 在 Bash 中,第一个方法看起来像这样:

set -- *.iso; md5sum "$@" | pv --line-mode -s $# | sort
Run Code Online (Sandbox Code Playgroud)

所述set内置用于设置位置参数到要处理的文件(该*.iso壳图案由壳展开)。md5sum然后被告知处理这些文件($@扩展到位置参数),并且pv在行模式下,每次处理文件/输出一行时都会移动进度指示器md5sum。值得注意的是,pv被告知它可以预期的总行数 ( -s $#),因为特殊的 shell 参数$#扩展到位置参数的数量。

第二种方法不是基于行而是基于字节的。由于md5sum这种不必要的复杂,但其他一些程序可能不会产生线条而是例如连续数据,那么这种方法可能更实用。我用它来说明md5sum。这个想法是计算md5sum(或其他程序)将产生的数据量,并使用它来通知pv. 在 Bash 中,这可能如下所示:

os=$(( $( ls -1 | wc -c ) + $( ls -1 | wc -l ) * 34 ))
md5sum * | pv -s $os | sort
Run Code Online (Sandbox Code Playgroud)

第一行计算输出大小 ( os) 估计值:第一项是编码文件名所需的字节数(包括换行符),第二项是用于编码 MD5 哈希的字节数(每个 32 字节),加2个空格。在第二行中,我们告诉pv预期的数据量是os字节,因此它可以显示一个准确的进度指示器,最高可达 100%(每个完成的 md5summed 文件都会更新该指示器)。

显然,这两种方法仅适用于要处理多个文件的情况。此外,应该注意的是,由于 的输出md5summd5sum程序必须花费在处理基础数据上的时间量无关,因此进度指示器可能会被认为有些误导。例如,在第二种方法中,名称最短的文件将产生最低的进度更新,即使它实际上可能是最大的。再说一次,如果所有文件都具有相似的大小和名称,这应该无关紧要。

  • 根据 `md5sum` 输出计算进度是一个非常好的主意(即使进度表明还剩下多少文件,而不是 - 有多大或需要多长时间)。然而,它不应该需要解析 `ls`。`pv` 支持 `--line-mode` 所以 `set -- *.iso; md5sum "$@" | pv --line-mode -s $# | 如果您用 sha512sum 或其他方式替换 md5sum,sort` 可能是等效的并且仍然有效。 (2认同)