作者 | Sandra Henry-stocker
譯者 | singledo
Linux 系統為檔案壓縮提供了許多選擇,關鍵是選擇一個最適合你的。
如果你對可用於 Linux 系統的檔案壓縮命令或選項有任何疑問,你也許應該看一下 apropos compress
這個命令的輸出。如果你有機會這麼做,你會驚異於有如此多的的命令來進行壓縮檔案和解壓縮檔案;此外還有許多命令來進行壓縮檔案的比較、檢驗,並且能夠在壓縮檔案中的內容中進行搜尋,甚至能夠把壓縮檔案從一個格式變成另外一種格式(如,將 .z
格式變為 .gz
格式 )。
你可以看到只是適用於 bzip2 壓縮的全部條目就有這麼多。加上 zip、gzip 和 xz 在內,你會有非常多的選擇。
$ apropos compress | grep ^bz
bzcat (1) - decompresses files to stdout
bzcmp (1) - compare bzip2 compressed files
bzdiff (1) - compare bzip2 compressed files
bzegrep (1) - search possibly bzip2 compressed files for a regular expression
bzexe (1) - compress executable files in place
bzfgrep (1) - search possibly bzip2 compressed files for a regular expression
bzgrep (1) - search possibly bzip2 compressed files for a regular expression
bzip2 (1) - a block-sorting file compressor, v1.0.6
bzless (1) - file perusal filter for crt viewing of bzip2 compressed text
bzmore (1) - file perusal filter for crt viewing of bzip2 compressed text
在我的 Ubuntu 系統上 ,apropos compress
命令的傳回中列出了 60 條以上的命令。
壓縮演演算法
壓縮並沒有普適的方案,某些壓縮工具是有失真壓縮,例如一些壓縮用於減少 mp3 檔案大小,而能夠使聆聽者有接近原聲的音樂感受。但是在 Linux 命令列上壓縮或歸檔使用者檔案所使用的演演算法必須能夠精確地重新恢復為原始資料。換句話說,它們必須是無損的。
這是如何做到的?讓我們假設在一行上有 300 個相同的字元可以被壓縮成像 “300x” 這樣的字串,但是這種演演算法對大多數檔案沒有很大的用處,因為檔案中不可能包含長的相同字元序列比完全隨機的序列更多。 壓縮演演算法要複雜得多,從 Unix 早期壓縮首次被引入以來,它就越來越複雜了。
在 Linux 系統上的壓縮命令
在 Linux 系統上最常用的檔案壓縮命令包括 zip
、gzip
、bzip2
、xz
。 所有這些壓縮命令都以類似的方式工作,但是你需要權衡有多少檔案要壓縮(節省多少空間)、壓縮花費的時間、壓縮檔案在其他你需要使用的系統上的相容性。
有時壓縮一個檔案並不會花費很多時間和精力。在下麵的例子中,被壓縮的檔案實際上比原始檔案要大。這並不是一個常見情況,但是有可能發生——尤其是在檔案內容達到一定程度的隨機性。
$ time zip bigfile.zip bigfile
adding: bigfile (default 0% )
real 0m0.055s
user 0m0.000s
sys 0m0.016s
$ ls -l bigfile*
-rw-r--r-- 1 root root 0 12月 20 22:36 bigfile
-rw------- 1 root root 164 12月 20 22:41 bigfile.zip
註意該檔案壓縮後的版本(bigfile.zip
)比原始檔案(bigfile
)要大。如果壓縮增加了檔案的大小或者減少很少的比例,也許唯一的好處就是便於線上備份。如果你在壓縮檔案後看到了下麵的資訊,你不會從壓縮中得到什麼受益。
( defalted 1% )
檔案內容在檔案壓縮的過程中有很重要的作用。在上面檔案大小增加的例子中是因為檔案內容過於隨機。壓縮一個檔案內容只包含 0
的檔案,你會有一個相當震驚的壓縮比。在如此極端的情況下,三個常用的壓縮工具都有非常棒的效果。
-rw-rw-r-- 1 shs shs 10485760 Dec 8 12:31 zeroes.txt
-rw-rw-r-- 1 shs shs 49 Dec 8 17:28 zeroes.txt.bz2
-rw-rw-r-- 1 shs shs 10219 Dec 8 17:28 zeroes.txt.gz
-rw-rw-r-- 1 shs shs 1660 Dec 8 12:31 zeroes.txt.xz
-rw-rw-r-- 1 shs shs 10360 Dec 8 12:24 zeroes.zip
令人印象深刻的是,你不太可能看到超過 1000 萬位元組而壓縮到少於 50 位元組的檔案, 因為基本上不可能有這樣的檔案。
在更真實的情況下 ,大小差異總體上是不同的,但是差別並不顯著,比如對於確實不太大的 jpg 圖片檔案來說。
-rw-r--r-- 1 shs shs 13522 Dec 11 18:58 image.jpg
-rw-r--r-- 1 shs shs 13875 Dec 11 18:58 image.jpg.bz2
-rw-r--r-- 1 shs shs 13441 Dec 11 18:58 image.jpg.gz
-rw-r--r-- 1 shs shs 13508 Dec 11 18:58 image.jpg.xz
-rw-r--r-- 1 shs shs 13581 Dec 11 18:58 image.jpg.zip
在對大的文字檔案同樣進行壓縮時 ,你會看到顯著的不同。
$ ls -l textfile*
-rw-rw-r-- 1 shs shs 8740836 Dec 11 18:41 textfile
-rw-rw-r-- 1 shs shs 1519807 Dec 11 18:41 textfile.bz2
-rw-rw-r-- 1 shs shs 1977669 Dec 11 18:41 textfile.gz
-rw-rw-r-- 1 shs shs 1024700 Dec 11 18:41 textfile.xz
-rw-rw-r-- 1 shs shs 1977808 Dec 11 18:41 textfile.zip
在這種情況下 ,xz
相較於其他壓縮命令有效的減小了檔案大小,對於第二的 bzip2 命令也是如此。
檢視壓縮檔案
這些以 more
結尾的命令(bzmore
等等)能夠讓你檢視壓縮檔案的內容而不需要解壓檔案。
bzmore (1) - file perusal filter for crt viewing of bzip2 compressed text
lzmore (1) - view xz or lzma compressed (text) files
xzmore (1) - view xz or lzma compressed (text) files
zmore (1) - file perusal filter for crt viewing of compressed text
為瞭解壓縮檔案內容顯示給你,這些命令做了大量的計算。但在另一方面,它們不會把解壓縮後的檔案留在你係統上,它們只是即時解壓需要的部分。
$ xzmore textfile.xz | head -1
Here is the agenda for tomorrow's staff meeting:
比較壓縮檔案
有幾個壓縮工具箱包含一個差異命令(例如 :xzdiff
),那些工具會把這些工作交給 cmp
和 diff
來進行比較,而不是做特定演演算法的比較。例如,xzdiff
命令比較 bz2 型別的檔案和比較 xz 型別的檔案一樣簡單 。
如何選擇最好的 Linux 壓縮工具
如何選擇壓縮工具取決於你工作。在一些情況下,選擇取決於你所壓縮的資料內容。在更多的情況下,取決你組織內的慣例,除非你對磁碟空間有著很高的敏感度。下麵是一般性建議:
zip 對於需要分享給或者在 Windows 系統下使用的檔案最適合。
gzip 或許對你要在 Unix/Linux 系統下使用的檔案是最好的。雖然 bzip2 已經接近普及,但 gzip 看起來仍將長期存在。
bzip2 使用了和 gzip 不同的演演算法,並且會產生比 gzip 更小的檔案,但是它們需要花費更長的時間進行壓縮。
xz 通常可以提供最好的壓縮率,但是也會花費相當長的時間。它比其他工具更新一些,可能在你工作的系統上還不存在。
註意
在壓縮檔案時,你有很多選擇,而在極少的情況下,並不能有效節省磁碟儲存空間。
via: https://www.networkworld.com/article/3240938/linux/how-to-squeeze-the-most-out-of-linux-file-compression.html
作者:Sandra Henry-Stocker[2] 譯者:singledo 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出