前言
經常使用電腦的人常常會接觸到壓縮文件,不管是軟件、數據還是資料,下載之後通常就是一個壓縮包,在Windows平臺上如果安裝了WinRAR或者360壓縮,不管是什麼格式的壓縮文件,一般點擊壓縮文件右鍵選擇解壓選項即可,非常地方便。正因爲長時間在Windows平臺上方便的解壓文件,導致我對打包、壓縮的概念理解錯誤,結果在linux操作壓縮文件時有很多疑問,今天終於明白了一點,專門總結一下,同時列舉常用的壓縮、解壓命令,方便日後查找使用。
linux上操作壓縮文件也是通過命令實現的,但是壓縮文件的後綴有很多,比如.tar.gz
、.tar.bz2
、.gz
、.zip
、.Z
等等,而生成和解壓這些文件的命令同樣很多,比如tar
、gzip
、bzip2
、zip
、unzip
等,看得人眼花繚亂,記憶的過程中也常常出現偏差,不是命令不對應就是參數錯誤,特別是一些不常用的壓縮格式,經常需要查詢嘗試,浪費了不少時間,其實造成這些問題的原因還是由於對打包壓縮的概念不太清楚,接下來先了解一下這些概念。
基礎概念
在Windows上經常直接在圖形化界面上操作壓縮和解壓文件,導致我將這種操作行爲帶到了linux上,而實際上在linux上壓縮和解壓文件之外還有一個操作就是“打包”,原因就是linux的壓縮和解壓通常作用在一個文件上,如果想將一大堆文件壓縮最終成爲一個文件,需要先打成一個包,然後對這個包文件進行壓縮。
打包/歸檔
打包或者叫歸檔,就是將多個文件和目錄(也可以是一個文件)就變成了一個總的文件,但不是將所有文件進行融合,使用tar
命令。
壓縮
壓縮是將一個大的文件通過特定的壓縮算法儘可能變成一個小文件,可以減少存儲空間,加快網絡傳輸效率,使用gzip
、bzip2
、zip
等命令。
解壓
解壓是將壓縮生成的最終的小文件還原爲壓縮之前的大文件,可以使用gzip
、gunzip
、bunzip2
、unzip
等命令。
打包壓縮
通過上面的概念解析我們可以知道,我們之前所說的壓縮操作通常是指打包和壓縮兩個步驟,由於linux大部分的壓縮命令都是隻能壓縮一個文件,所以在壓縮之前需要將待壓縮的所有文件先進行打包,生成一個文件後再進行壓縮操作。
明白了打包和壓縮操作的含義,我們可以通過一些約定俗成的命名規則,選擇合適的壓縮和解壓方法,比如下面這些文件:
- xxx.tar:這是一個歸檔文件,也就是隻通過
tar
進行了打包操作 - xxx.tar.gz:這是一個壓縮文件,打包之後,以
gzip
方式進行了壓縮 - xxx.tar.bz2:這是一個壓縮文件,打包之後,以
bzip2
方式進行了壓縮 - xxx.gz:這是一個壓縮文件,沒有經過打包操作,只是
gzip
方式進行了壓縮
如果能按照這些命名規則生成壓縮文件,那麼解壓文件的時候會方便很多,但有時壓縮文件的擴展名是不標準的,可以通過file
命令查看文件實際的格式,使用方法如下:
[albert@localhost#15:03:05#/home/albert/compress]$file test.tar.bz2
test.tar.bz2: bzip2 compressed data, block size = 900k
[albert@localhost#15:03:24#/home/albert/compress]$file test.tar.gz
test.tar.gz: gzip compressed data, from Unix, last modified: Wed Nov 6 12:02:05 2019
壓縮解壓命令
壓縮文件的格式和命令真的是太多,所以在此總結一份常用命令表格,方便日後需要的時候直接拿來就用,加快解決問題的速度。假設原始文件是a.log和b.txt,當前目錄下還有一個output目錄,可以作爲解壓後存放文件的目錄,那麼常用壓縮和解壓命令如下:
文件格式 | 壓縮命令 | 命令備註 | 解壓命令 | 命令備註 |
---|---|---|---|---|
xxx.tar | tar -cvf test.tar a.log b.txt |
- | tar -xvf test.tar -C ./output |
不使用-C 則解包在當前目錄 |
xxx.tar.gz | tar -zcvf test.tar.gz a.log b.txt |
- | tar -zxvf test.tar.gz -C ./output |
不使用-C 則解壓在當前目錄 |
xxx.tar.bz2 | tar -jcvf test.tar.bz2 a.log b.txt |
- | tar -jxvf test.tar.bz2 -C ./output |
不使用-C 則解壓在當前目錄 |
xxx.tar.Z | tar -Zcvf test.tar.Z a.log b.txt |
- | tar -Zxvf test.tar.Z -C ./output |
不使用-C 則解壓在當前目錄 |
xxx.gz | gzip -c a.log > test.gz 、gzip a.log |
前者保留a.log,後者直接刪除a.log | gzip -d test.gz 、gunzip test.gz |
不能指定解壓文件存儲目錄 |
xxx.bz2 | bzip2 -c a.log > test.bz2 、bzip2 a.log |
前者保留a.log,後者直接刪除a.log | bzip2 -d test.bz2 、bunzip2 test.bz2 |
不能指定解壓文件存儲目錄 |
xxx.Z | compress -c a.log > test.Z 、compress a.log |
前者保留a.log,後者直接刪除a.log | compress -d test.Z 、uncompress test.Z |
不能指定解壓文件存儲目錄 |
xxx.rar | rar a test.rar a.log |
- | unrar e test.rar |
將e 選項換成x 可以指定目錄 |
xxx.zip | zip test.zip a.log b.txt |
- | unzip test.zip -d ./output |
不使用-d 則解壓在當前目錄 |
分析對比上面的壓縮也解壓命令可以發現,tar
這個命令可以將打包和壓縮合併到一起,也可以將解壓和解包合併到一起,只需要修改選項中的參數就可以調用不同的程序壓縮或者解壓,比如-cvf
表示只打包不壓縮,而-zcvf
表示打包後使用gzip
壓縮,改爲-jcvf
表示打包後使用bzip2
壓縮,其實還有很多的壓縮方式,可以參考一下tar
命令的幫助文檔,具體壓縮選項如下。
壓縮選項:
-a, --auto-compress 使用歸檔後綴名來決定壓縮程序
-I, --use-compress-program=PROG 通過 PROG 過濾(必須是能接受 -d 選項的程序)
-j, --bzip2 通過 bzip2 過濾歸檔
-J, --xz 通過 xz 過濾歸檔
–lzip 通過 lzip 過濾歸檔
–lzma 通過 lzma 過濾歸檔
–lzop
–no-auto-compress 不使用歸檔後綴名來決定壓縮程序
-z, --gzip, --gunzip, --ungzip 通過 gzip 過濾歸檔
-Z, --compress, --uncompress 通過 compress 過濾歸檔
總結
- 上述這些命令只是基礎用法,還有很多參數選型沒有提到,比如
tar -tf test.tar
可以不解壓直接查看歸檔文件中的內容。 gzip
命令只能壓縮一個文件,如果在命令後面添加多個文件,則會分別壓縮生成多個文件。- 據說
compress
命令是一個相當古老的 unix 檔案壓縮指令,現在基本被gzip
命令取代了。 - 由於文中涉及的命令較多,難免有些筆誤,爲了不傳播錯誤用法,我也進行了多次檢查,如果大家還發現其他錯誤,歡迎批評指正。