我已在目录中递归压缩文件。但我注意到最后几个 zip 文件没有被压缩。
adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042406.dcm (deflated 0%)
adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042279.dcm (deflated 0%)
adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042466.dcm (deflated 0%)
adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042200.dcm (deflated 0%)
adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042227.dcm (deflated 0%)
adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042372.dcm (deflated 0%)
adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042245.dcm (deflated 0%)
adding: 1.3.12.2.1107.5.1.4.64517.30000014091005511462300042282.dcm (deflated 0%)
谁能解释为什么使用 zip 时会发生这种情况?
答案1
正如在评论,SO问题几乎涵盖了这一点。现在,我想尝试一下这种通货紧缩实际上是如何运作的。所以,我做了以下测试。
什么是熵?
熵是信息流不可预测性的度量。完全一致的比特流(全零或全一)是完全可预测的(没有熵)。完全不可预测的比特流具有最大熵。信息熵的概念归功于克劳德·香农(Claude Shannon),他给出了表达它的公式。
现在,我创建了一个文件,如下y
所示n
。
perl -e 'my $y; $y .= int(rand(100))>90 ? "y" : "n" for (0..999); print $y;' > f1
现在,我运行命令,zip f1.zip f1
得到的输出为:
zip f1.zip f1
adding: f1 (deflated 89%)
现在,在上面的命令中,我们有可预测的字节y
,n
这就是为什么我们的百分比缩减为 89。
现在,我正在进行如下实验。
dd if=/dev/urandom of=./f2 bs=1M count=1
如果我执行命令zip f2.zip f2
,这就是我得到的输出。
zip f2.zip f2
adding: f2 (deflated 0%)
由于这/dev/urandom
是完全不可预测的,我们的通货紧缩率为 0%。我在下面提供的参考链接对如何计算可预测字节的熵有很好的解释。
此外,还有这个工具ent
可以在基于 debian 的系统中计算文件的熵。你可以做一个apt get install ent
并计算熵率ent filename
并找出到底发生了什么。
你可以阅读这里关于此命令。
参考