某些压缩程序可以在执行任务时显示信息(例如压缩比或时间和大小总计),例如xz -v
:
--- % 2,580.2 KiB / 6,552.0 KiB =0.394 1.2 MiB/秒 0:05
在压缩大文件时,我想知道任务中的压缩率,以便在压缩率较低时停止该过程并保持其未压缩状态。
还有其他程序有这个功能吗? (xz
压缩比高但速度慢)
答案1
执行此操作的通用方法是使用类似pv
监视压缩程序的输入和输出大小的方法。例如 :
$ pv -cpterba -N in /dev/urandom | gzip | pv -cpterba -N out > /dev/null
out: 956MiB 0:00:42 [23.1MiB/s] [22.8MiB/s] [ <=> ]
in: 956MiB 0:00:42 [23.1MiB/s] [22.8MiB/s] [ <=> ]
从上面很容易看出,输出大小与输入大小相同 - 正如尝试压缩随机数据时所预期的那样。
如果我们尝试使用压缩效果非常好的文件:
$ pv -cpterba -N in /dev/zero | gzip | pv -cpterba -N out > /dev/null
out: 2.62MiB 0:00:25 [ 109KiB/s] [ 107KiB/s] [ <=> ]
in: 2.65GiB 0:00:25 [ 110MiB/s] [ 108MiB/s] [ <=> ]
输出大小为 2.62MiB,输入大小为 2.65GiB,大了 3 个数量级。
作为一个附带好处,如果在普通文件上使用,pv
将为您提供预计到达时间:
$ pv -cpterba -N in debian-8.2.0-amd64-DVD-1.iso | gzip | pv -cpterba -N out > /dev/null
out: 578MiB 0:00:27 [22.1MiB/s] [21.4MiB/s] [ <=> ]
in: 595MiB 0:00:27 [22.1MiB/s] [ 22MiB/s] [==> ] 15% ETA 0:02:25
Jessie DVD映像大部分是压缩文件,因此压缩效果不是很好,但还需要两分半钟才能完成。
您还可以用来pv -d
监视已经运行的进程 - 如果您将其应用于正在运行的压缩器,它会告诉您它在输入文件与输出文件中的位置,再次让您快速查看比率:
$ pv -pterba -d "$(pidof gzip)"
3:/var/tmp/mp3s.tar: 911MiB 0:00:44 [ 20MiB/s] [19.9MiB/s] [> ] 9% ETA 0:07:35
4:/var/tmp/mp3s.tar.gz: 906MiB 0:00:44 [ 20MiB/s] [19.8MiB/s] [ <=> ]
MP3 的 Tar 文件也不能很好地压缩。
笔记:许多压缩机都是逐块工作的。这就是为什么您可能会看到传输速率飙升然后变为 0 之类的情况,重复这一过程。您需要让压缩机运行一段时间,然后才能真正了解预期的比率。请记住,在峰值之后,可能会在一个块中读取它,但尚未写入压缩版本 - 但如果您已经等待了 10 个块,则最多有 10% 的错误。
(我使用的 pv 选项:-p
打开进度条;-t
打开已用时间;-e
打开 ETA;-r
显示传输速率;-b
打开字节计数器;-c
使pv
管道中的多个 s 工作;-N
设置标签)。