Zip
zip 壓縮時不壓縮文件
我已經在一個目錄中遞歸地壓縮了一個文件。但是我注意到最後幾個 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 時會發生這種情況?
正如評論中提到的,SO問題已經涵蓋了這一點。現在,我想試驗一下這種通貨緊縮實際上是如何運作的。所以,我做了下面的測試。
什麼是熵?
熵是資訊流不可預測性的度量。完全一致的比特流(全零或全一)是完全可預測的(沒有熵)。完全不可預測的比特流具有最大熵。資訊熵的概念歸功於克勞德香農,他給出了一個表達它的公式。
現在,我創建了一個文件,
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
並找出真正發生的事情。您可以從此處閱讀有關此命令的資訊。
參考