我用来检查同一目录md5sum
中pv
的 4 GiB 文件:
md5sum dir/* | pv -s 4g | sort
该命令在大约 28 秒内成功完成,但pv
输出全错。这是始终显示的那种输出:
219 B 0:00:07 [ 125 B/s ] [> ] 0% ETA 1668:01:09:02
没有-s 4g
and也是这样| sort
。我也尝试过使用不同的文件。
我试过使用pv
withcat
并且输出很好,所以问题似乎是由md5sum
.
该
pv
实用程序是“花哨的cat
”,这意味着您可以pv
在大多数情况下使用cat
.使用
cat
withmd5sum
,您可以计算单个文件的 MD5 校验和或者,与
pv
,不幸的是,这不允许
md5sum
将文件名正确插入到其输出中。现在,幸运的
pv
是,它真的很花哨cat
,并且在某些系统(Linux)上,它能够观察正在通过另一个进程的数据。这是通过将其-d
选项与该其他进程的进程 ID 一起使用来完成的。这意味着您可以执行以下操作
这将允许
pv
观看该md5sum
过程。sleep
允许md5sum
在后台运行的 正确启动 。pgrep -n md5sum
将返回您拥有的最近启动的md5sum
进程的 PID。pv
将在它正在监视的进程终止后立即退出。我已经测试了这种特殊的运行方式
pv
几次,它似乎通常运行良好,但有时它似乎停止输出任何东西作为md5sum
切换到下一个文件。有时,它似乎会在 shell 中生成虚假的后台任务。运行它可能是最安全的
该
-W
选项将导致pv
等待直到有实际数据正在传输,尽管这似乎并不总是可靠地工作。您通过管道提供的数据
md5sum
不是正在处理的文件的数据,而是md5sum
输出,对于每个文件,输出由一行组成:MD5 哈希、两个空格和文件名。既然我们提前知道了这一点,就可以pv
据此告知,从而使它能够显示一个准确的进度指示器。有两种方法可以这样做。第一种首选方法(由frostschutz 建议)利用了
md5sum
每个已处理文件生成一行的事实,以及pv
具有计算行数而不是字节数的行模式这一事实。在这种模式下pv
,只有在吞吐量中遇到换行符时才会移动进度条,即每个文件由md5sum
. 在 Bash 中,第一种方法可能如下所示:set
内置函数用于为要处理的文件设置位置参数(外壳*.iso
模式由外壳扩展)。md5sum
然后被告知处理这些文件($@
扩展为位置参数),并且pv
在行模式下,每次处理文件/一行输出时都会移动进度指示器md5sum
。值得注意的是,pv
它可以预期的总行数 (-s $#
),因为特殊的 shell 参数$#
扩展到位置参数的数量。第二种方法不是基于行,而是基于字节。有了
md5sum
这个不必要的复杂,但一些其他程序可能不会产生行,而是例如连续数据,然后这种方法可能更实用。我用它来说明它md5sum
。这个想法是计算md5sum
(或其他程序)将产生的数据量,并用它来通知pv
. 在 Bash 中,这可能如下所示:第一行计算输出大小 (
os
) 估计值:第一项是编码文件名所需的字节数(包括换行符),第二项是用于编码 MD5 哈希的字节数(每个 32 个字节),加上2个空格。在第二行中,我们告诉我们pv
预期的数据量是os
字节,这样它就可以显示一个准确的进度指示器,直到 100%(每个完成的 md5summed 文件都会更新该指示器)。显然,这两种方法仅在要处理多个文件的情况下才实用。此外,应该注意的是,由于 的输出与程序必须花费在处理基础数据上
md5sum
的时间量无关,因此进度指标可能会被认为有些误导。md5sum
例如,在第二种方法中,具有最短名称的文件将产生最低的进度更新,即使它实际上可能是最大的。再说一次,如果所有文件的大小和名称都相似,那应该没什么大不了的。这是一个获取每个文件进度的肮脏技巧:
它看起来像什么:
现在,这做了几个假设。首先,读取数据比散列数据要慢。其次,该操作系统将缓存 I/O,因此即使数据不会被(物理)读取两次,
pv
并且md5sum
是完全独立的读取器。这种肮脏、肮脏的 hack 的好处在于,您可以轻松地对其进行调整,以在所有数据上制作进度条,而不仅仅是一个文件。并且仍然会做一些奇怪的事情,比如事后对输出进行排序。
它看起来像什么(正在进行):
它的样子(完成):
现在,这是针对黑客的。检查其他答案以获得正确的解决方案。;-)
正如评论和其他答案中已经指出的那样:
pv
只输入md5sum
' 的输出:校验和和文件名;因此,pv
的进度条无法显示md5sum
正在读取的数据量。pv
您要输入的文件的大小(手动,使用-s
)是不方便的。将文件内容输入
pv
然后输入md5sum
会给您一个进度条,但文件名会丢失。这段代码不是那么优雅的方式,同时拥有一个有意义的进度条和带有校验和的文件名:
该脚本的调用方式如下:
你当然可以将它声明为一个函数,以避免输入它的路径来调用它(或将它添加到你的
PATH
):这样,该命令
pvsum dir/* | sort
将等同于您的md5sum dir/* | pv -s <size> | sort
.它的输出:
它能做什么:
pv
到md5sum
,显示默认进度条。sed
用于删除-
打印的 bymd5sum
(从标准输入读取);这也试图使输出适合md5sum -c
(感谢frostschutz指出这一点)1消耗。关于
sort
:我不确定您的预期结果,所以我忽略了它。由于
pv
将其进度条写入标准错误,因此将所有内容通过管道传输sort
将pv
' 的输出与md5sum
' 的输出分离。无论如何,您可以在上面的代码中追加
| sort
afterdone
并检查结果是否适合您。1
md5sum -c
请注意,如果文件名包含换行符,上面显示的代码的输出将不适合。处理换行符是可能的,但某些版本的md5sum
行为在这方面有所不同(例如,请参阅此问题的答案),使得通用解决方案并不容易(并且超出了此答案的范围)。假设最新版本的
md5sum
,解决此问题的尝试可能是:唯一的加法,即 final
sed
,将:H
将换行符和当前模式空间附加到保持空间;1h
覆盖 previousH
,仅针对第一行,执行相同但不附加换行符;$!d
如果当前行不是最后一行,则开始一个新的循环;g
将保持空间的内容放入模式空间。\
) 转义生成的模式空间中的任何反斜杠。\n
为结果模式空间中的任何换行符。t x
: branch to labelx
)时,才会在校验和的开头添加反斜杠以md5sum -c
表示必须对某些内容进行转义;否则就退出。p
在这两种情况下,在退出之前将模式空间打印( )到标准输出(该选项-n
禁用自动打印)。我也很喜欢驯服“花式猫”
pv
,因为md5sum
:-)usage
如果您没有正确输入模式,则会出现输出。".* *"
... OK
pv
将保留在 {screen/terminal window}pv
进程,一个全局的,每个文件一个,全局pv
的‘只统计文件’,另一个测量传输的数据的速度和数量我使用名称
md5summer
,使 shellscript 可执行并将其放在 PATH 中的目录中(我的~/bin
目录,您可能更喜欢/usr/local/bin
)。演示示例
用法
我在这个目录下测试过
正常使用加模式查看隐藏文件
详细输出加上模式以查看隐藏文件
重定向到一个文件,首先是屏幕输出
然后保存的输出
检查iso文件