在 Linux 上壓縮文件的 5 種方法
在 Linux 上有不少用于壓縮文件的命令。最新最有效的一個(gè)方法是 xz,但是所有的方法都有節(jié)省磁盤空間和維護(hù)備份文件供以后使用的優(yōu)點(diǎn)。在這篇文章中,我們將比較這些壓縮命令并指出顯著的不同。
tar
tar 命令不是專門的壓縮命令。它通常用于將多個(gè)文件拉入一個(gè)單個(gè)的文件中,以便容易地傳輸?shù)搅硪粋€(gè)系統(tǒng),或者將文件作為一個(gè)相關(guān)的組進(jìn)行備份。它也提供壓縮的功能,這就很有意義了,附加一個(gè) z 壓縮選項(xiàng)能夠?qū)崿F(xiàn)壓縮文件。
當(dāng)使用 z 選項(xiàng)為 tar 命令附加壓縮過(guò)程時(shí),tar 使用 gzip 來(lái)進(jìn)行壓縮。
就像壓縮一組文件一樣,你可以使用 tar 來(lái)壓縮單個(gè)文件,盡管這種操作與直接使用 gzip 相比沒(méi)有特別的優(yōu)勢(shì)。要使用 tar 這樣做,只需要使用 tar cfz newtarfile filename 命令來(lái)標(biāo)識(shí)要壓縮的文件,就像標(biāo)識(shí)一組文件一樣,像這樣:
- $ tar cfz bigfile.tgz bigfile
- ^ ^
- | |
- +- 新的文件 +- 將被壓縮的文件
- $ ls -l bigfile*
- -rw-rw-r-- 1 shs shs 103270400 Apr 16 16:09 bigfile
- -rw-rw-r-- 1 shs shs 21608325 Apr 16 16:08 bigfile.tgz
注意,文件的大小顯著減少了。
如果你愿意,你可以使用 tar.gz 擴(kuò)展名,這可能會(huì)使文件的特征更加明顯,但是大多數(shù)的 Linux 用戶將很可能會(huì)意識(shí)到與 tgz 的意思是一樣的 – tar 和 gz的組合來(lái)顯示文件是一個(gè)壓縮的 tar 文件。在壓縮完成后,你將同時(shí)得到原始文件和壓縮文件。
要將很多文件收集在一起并在一個(gè)命令中壓縮出 “tar ball”,使用相同的語(yǔ)法,但要指定要包含的文件為一組,而不是單個(gè)文件。這里有一個(gè)示例:
- $ tar cfz bin.tgz bin/*
- ^ ^
- | +-- 將被包含的文件
- + 新的文件
zip
zip 命令創(chuàng)建一個(gè)壓縮文件,與此同時(shí)保留原始文件的完整性。語(yǔ)法像使用 tar 一樣簡(jiǎn)單,只是你必需記住,你的原始文件名稱應(yīng)該是命令行上的最后一個(gè)參數(shù)。
- $ zip ./bigfile.zip bigfile
- updating: bigfile (deflated 79%)
- $ ls -l bigfile bigfile.zip
- -rw-rw-r-- 1 shs shs 103270400 Apr 16 11:18 bigfile
- -rw-rw-r-- 1 shs shs 21606889 Apr 16 11:19 bigfile.zip
gzip
gzip 命令非常容易使用。你只需要鍵入 gzip,緊隨其后的是你想要壓縮的文件名稱。不像上述描述的命令,gzip 將“就地”加密文件。換句話說(shuō),原始文件將被加密文件替換。
- $ gzip bigfile
- $ ls -l bigfile*
- -rw-rw-r-- 1 shs shs 21606751 Apr 15 17:57 bigfile.gz
bzip2
像使用 gzip 命令一樣,bzip2 將在你選擇的文件“就地”壓縮,不留下原始文件。
- $ bzip bigfile
- $ ls -l bigfile*
- -rw-rw-r-- 1 shs shs 18115234 Apr 15 17:57 bigfile.bz2
xz
xz 是壓縮命令團(tuán)隊(duì)中的一個(gè)相對(duì)較新的成員,在壓縮文件的能力方面,它是一個(gè)領(lǐng)跑者。像先前的兩個(gè)命令一樣,你只需要將文件名稱提供給命令。再?gòu)?qiáng)調(diào)一次,原始文件被就地壓縮。
- $ xz bigfile
- $ ls -l bigfile*
- -rw-rw-r-- 1 shs shs 13427236 Apr 15 17:30 bigfile.xz
對(duì)于大文件來(lái)說(shuō),你可能會(huì)注意到 xz 將比其它的壓縮命令花費(fèi)更多的運(yùn)行時(shí)間,但是壓縮的結(jié)果卻是非常令人贊嘆的。
對(duì)比
大多數(shù)人都聽(tīng)說(shuō)過(guò)“大小不是一切”。所以,讓我們比較一下文件大小以及一些當(dāng)你計(jì)劃如何壓縮文件時(shí)的問(wèn)題。
下面顯示的統(tǒng)計(jì)數(shù)據(jù)都與壓縮單個(gè)文件相關(guān),在上面顯示的示例中使用 bigfile。這個(gè)文件是一個(gè)大的且相當(dāng)隨機(jī)的文本文件。壓縮率在一定程度上取決于文件的內(nèi)容。
(1) 大小減縮率
當(dāng)比較時(shí),上面顯示的各種壓縮命產(chǎn)生下面的結(jié)果。百分比表示壓縮文件與原始文件的比較效果。
- -rw-rw-r-- 1 shs shs 103270400 Apr 16 14:01 bigfile
- ------------------------------------------------------
- -rw-rw-r-- 1 shs shs 18115234 Apr 16 13:59 bigfile.bz2 ~17%
- -rw-rw-r-- 1 shs shs 21606751 Apr 16 14:00 bigfile.gz ~21%
- -rw-rw-r-- 1 shs shs 21608322 Apr 16 13:59 bigfile.tgz ~21%
- -rw-rw-r-- 1 shs shs 13427236 Apr 16 14:00 bigfile.xz ~13%
- -rw-rw-r-- 1 shs shs 21606889 Apr 16 13:59 bigfile.zip ~21%
xz 命令獲勝,最終只有壓縮文件 13% 的大小,但是所有這些壓縮命令都相當(dāng)顯著地減少原始文件的大小。
(2) 是否替換原始文件
bzip2、gzip 和 xz 命令都用壓縮文件替換原始文件。tar 和 zip 命令不替換。
(3) 運(yùn)行時(shí)間
xz 命令似乎比其它命令需要花費(fèi)更多的時(shí)間來(lái)加密文件。對(duì)于 bigfile 來(lái)說(shuō),大概的時(shí)間是:
- 命令 運(yùn)行時(shí)間
- tar 4.9 秒
- zip 5.2 秒
- bzip2 22.8 秒
- gzip 4.8 秒
- xz 50.4 秒
解壓縮文件很可能比壓縮時(shí)間要短得多。
(4) 文件權(quán)限
不管你對(duì)壓縮文件設(shè)置什么權(quán)限,壓縮文件的權(quán)限將基于你的 umask 設(shè)置,但 bzip2 除外,它保留了原始文件的權(quán)限。
(5) 與 Windows 的兼容性
zip 命令創(chuàng)建的文件可以在 Windows 系統(tǒng)以及 Linux 和其他 Unix 系統(tǒng)上使用(即解壓),而無(wú)需安裝其他工具,無(wú)論這些工具可能是可用還是不可用的。
解壓縮文件
解壓文件的命令與壓縮文件的命令類似。在我們運(yùn)行上述壓縮命令后,這些命令用于解壓縮 bigfile:
- tar: tar xf bigfile.tgz
- zip: unzip bigfile.zip
- gzip: gunzip bigfile.gz
- bzip2: bunzip2 bigfile.gz2
- xz: xz -d bigfile.xz 或 unxz bigfile.xz
自己運(yùn)行壓縮對(duì)比
如果你想自己運(yùn)行一些測(cè)試,抓取一個(gè)大的且可以替換的文件,并使用上面顯示的每個(gè)命令來(lái)壓縮它 —— 最好使用一個(gè)新的子目錄。你可能需要先安裝 xz,如果你想在測(cè)試中包含它的話。這個(gè)腳本可能更容易地進(jìn)行壓縮,但是可能需要花費(fèi)幾分鐘完成。
- #!/bin/bash
- # 詢問(wèn)用戶文件名稱
- echo -n "filename> "
- read filename
- # 你需要這個(gè),因?yàn)橐恍┟顚⑻鎿Q原始文件
- cp $filename $filename-2
- # 先清理(以免先前的結(jié)果仍然可用)
- rm $filename.*
- tar cvfz ./$filename.tgz $filename > /dev/null
- zip $filename.zip $filename > /dev/null
- bzip2 $filename
- # 恢復(fù)原始文件
- cp $filename-2 $filename
- gzip $filename
- # 恢復(fù)原始文件
- cp $filename-2 $filename
- xz $filename
- # 顯示結(jié)果
- ls -l $filename.*
- # 替換原始文件
- mv $filename-2 $filename