本文是筆者對鳥叔的Linux私房菜(基礎學習篇) 第三版(中文網站)中關於 Linux 環境下打包和解壓縮指令的內容以及日常操作過程中所接觸的相關指令的總結和記錄,以供備忘和分享。更多詳細信息可直接參考對應Linux命令的 man 幫助( 如 man tar)。
在Linux環境下,對於文件的操作更多通過命令行指令而不是單純的鼠標點擊,而文件管理中一個重要的操作便是壓縮和加壓操作。通過文件的壓縮和解壓,可以使得文件占用更少的存儲空間,也可以讓文件傳輸更加便捷。本文主要介紹Linux下常用的打包指令和解壓縮指令,並介紹不同的壓縮文件拓展名的區別。
索引
隨着壓縮技術的發展,Linux環境下提供的壓縮指令和格式開始變多。為了便於用戶區分不同壓縮文件使用的不同壓縮技術,進而使用合適的指令進行操作,一般使用后綴標識文件在壓縮或打包過程中所使用的壓縮技術。常見的后綴有以下幾種:
*.Z // compress程序壓縮產生的文件(現在很少使用) *.gz // gzip程序壓縮產生的文件 *.bz2 // bzip2程序壓縮產生的文件
*.zip // zip壓縮文件
*.rar // rar壓縮文件
*.7z // 7-zip壓縮文件
*.tar // tar程序打包產生的文件 *.tar.gz // 由tar程序打包並由gzip程序壓縮產生的文件 *.tar.bz2 // 由tar程序打包並由bzip2程序壓縮產生的文件
依據不同的壓縮格式,linux 環境下可使用多種不同的命令進行文件的壓縮和解壓操作。其中,gzip、bzip2、tar、unzip、unrar 等指令是在打包和壓縮過程中較為常用的指令。
gzip
gzip可以壓縮產生后綴為 .gz 的壓縮文件,也可以用於解壓gzip、compress等程序壓縮產生的文件。不帶任何選項和參數使用gzip或只帶有參數 - 時,gzip從標准輸入讀取輸入,並在標准輸出輸出壓縮結果。
gzip的常用指令選項如下:
基礎格式: gzip [Options] file1 file2 file3
指令選項:(默認功能為壓縮)
-c //將輸出寫至標准輸出,並保持原文件不變
-d //進行解壓操作
-v //輸出壓縮/解壓的文件名和壓縮比等信息
-digit //digit部分為數字(1-9),代表壓縮速度,digit越小,則壓縮速度越快,但壓縮效果越差,digit越大,則壓縮速度越慢,壓縮效果越好。默認為6.
注意,使用 gzip 指令壓縮/解壓文件均會使得源文件消失,即源文件會被直接解壓/壓縮而不保留備份。若想要保留原文件可以使用 -c 參數結合數據流重定向操作(見下例)。
gzip exp1.txt exp2.txt //分別將exp1.txt和exp2.txt壓縮,且不保留原文件。注意對於多個文件參數是將多個文件分別進行壓縮,而不是壓縮在一起。參考下文 tar 指令。
gzip -dv exp1.gz //將exp1.gz解壓,並顯示壓縮比等信息。
gzip -cd exp1.gz > exp.1 //將exp1.gz解壓的結果放置在文件exp.1中,並且原壓縮文件exp1.gz不會消失
特別注意第三條實例, -d 指示解壓縮,-c 參數是將結果輸出至標准輸出,通過 > 符號,將原本輸出至標准輸出的解壓結果重定向至exp.1中,既解壓了文件,原壓縮文件也沒有消失。
注:對應於 gzip,可以使用 gunzip 進行解壓操作,效果類似gzip -d xx,同時可以使用zcat讀取壓縮文件的內容並顯示在標准輸出,功能類似於 gzip -c xx.
bzip2
bzip2是采用更好壓縮算法的壓縮程序,一般可以提供較之gzip更好的壓縮效果。其具有與gzip相似的指令選項,壓縮產生 .bz2 后綴的壓縮文件。
bzip2的常用指令選項如下:
基礎格式: bzip2 [Options] file1 file2 file3 指令選項:(默認功能為壓縮) -c //將輸出寫至標准輸出 -d //進行解壓操作
-v //輸出壓縮/解壓的文件名和壓縮比等信息 -k //在壓縮/解壓過程中保留原文件
-digit //digit部分為數字(1-9),代表壓縮速度,digit越小,則壓縮速度越快,但壓縮效果越差,digit越大,則壓縮速度越慢,壓縮效果越好。默認為6.
bzip2 exp1.txt exp2.txt //分別將exp1.txt和exp2.txt壓縮,且不保留原文件。
bzip2 -dv exp1.bz2 //將exp1.bz2解壓,並顯示壓縮比等信息。
bzip2 -kd exp1.bz2 //將exp1.bz2解壓,並且原壓縮文件exp1.bz2不會消失
注:對應於 bzip2,可以使用 bunzip2 進行解壓操作,效果類似bunzip2 -d xx,同時可以使用bzcat讀取壓縮文件的內容並顯示在標准輸出,功能類似於 bzip2 -c xx.
上文已經提到,gzip 或 bzip2 帶有多個文件作為參數時,執行的操作是將各個文件獨立壓縮,而不是將其放在一起進行壓縮。這樣就無法產生類似於Windows環境下的文件夾打包壓縮的效果。(gzip與bzip2也可以使用文件夾作為參數,使用 -f 選項,但也是將其中的每個文件獨立壓縮)。為了實現打包壓縮的效果,可以使用命令 tar 進行文件的打包操作(archive),再進行壓縮。
tar 指令可以將文件打包成文件檔案(archive)存儲在磁盤/磁帶中,打包操作一般伴隨壓縮操作,也可以使用 tar 指令對打包壓縮后的文件解壓。
tar 常用命令參數如下:
基本格式:tar [Options] file_archive //注意tar的第一參數必須為命令選項,即不能直接接待處理文件 常用命令參數:
//指定tar進行的操作,以下三個選項不能出現在同一條命令中
-c //創建一個新的打包文件(archive)
-x //對打包文件(archive)進行解壓操作
-t //查看打包文件(archive)的內容,主要是構成打包文件(archive)的文件名
//指定支持的壓縮/解壓方式,操作取決於前面的參數,若為創建(-c),則進行壓縮,若為解壓(-x),則進行解壓,不加下列參數時,則為單純的打包操作(而不進行壓縮),產生的后綴文件為.tar
-z //使用gzip進行壓縮/解壓,一般使用.tar.gz后綴
-j //使用bzip2進行壓縮/解壓,一般使用.tar.bz2后綴
//指定tar指令使用的文件,若沒有壓縮操作,則以.tar作為后綴
-f filename //-f后面接操作使用的文件,用空格隔開,且中間不能有其他參數,推薦放在參數集最后或單獨作為參數
//文件作用取決於前面的參數,若為創建(-c),則-f后為創建的文件的名字(路徑),若為(-x/t),則-f后為待解壓/查看的打包壓縮文件名
//其他輔助選項
-v //詳細顯示正在處理的文件名
-C Dir //將解壓文件放置在 -C 指定的目錄下
-p(小寫) //保留文件的權限和屬性,在備份文件時較有用
-P(大寫) //保留原文件的絕對路徑,即不會拿掉文件路徑開始的根目錄,則在還原時會覆蓋對應路徑上的內容
--exclude=file //排除不進行打包的文件
常見的tar指令操作如下:
壓縮:
tar -cvjpf etc.tar.bz2 /etc //-c為創建一個打包文件,相應的-f后面接創建的文件的名稱,使用了.tar.bz2后綴,-j標志使用bzip2壓縮,最后面為具體的操作對象/etc目錄
查看:
tar -tvjf etc.tar.bz2 //-t為查看操作,則-f對應所查看的文件的名稱,文件后綴顯示使用bzip2進行壓縮,所以加入-j選項,-v會顯示詳細的權限信息
解壓
tar -xvjf etc.tar.bz2 //-x為解壓操作,則-f指定的是解壓使用的文件,文件后綴顯示使用bzip2進行壓縮,所以加入-j選項,即使用bzip2解壓
//若只解壓指定打包文件中的一個文件,在上述指令的最后加上待解壓文件名作為參數即可
解壓
tar -xvf etc.tar -C ~ //將直接打包的.tar文件解壓,並放置在用戶主目錄下
注意:使用tar打包的文件會保存原有的文件路徑,並默認取出了所有成員文件路徑的根目錄,如下圖

這樣做的目的在於,當用戶在某一目錄如/home/haha目錄下進行解壓操作時,tar會將解壓出來的文件路徑與當前目錄拼接,即為 /home/haha/etc/emacs,從而將文件解壓在當前目錄下。(如果還有印象,目錄名也可以使用 -C 選項指定)但若是打包壓縮時不取出文件路徑的根目錄,則會按照存儲的絕對路徑如/etc/emacs解壓文件,可能將/etc文件下的相應文件覆蓋掉,當然在進行備份和恢復時該操作是有效的。tar提供 -P選項來保留文件路徑的根目錄。
unzip 命令與之前的 tar 指令類似,具有對 zip 文件進行查看、測試和解壓的功能。
基本格式:unzip [Options] file[.zip] //不接任何Options時,默認將指定的file文件解壓至當前文件夾,可同時接受多個文件參數 常用命令參數: //壓縮文件內容查看 -Z //以形如 ls -l 的格式顯示目標文件內容,實際原理是命令第一個參數為-Z時,其余參數會被視為 zipinfo 的參數,並產生對應效果 -Z1 //僅顯示壓縮文件內容的文件名,更多顯示可查看 zipinfo 命令的 man 幫助
-l //顯示壓縮文件中包括時間、占用空間和文件名等信息,內容上較 -Z 更簡單
//文件測試
-t //在內存中解壓文件並進行文件的完整性校驗(CRC校驗)
//解壓縮參數,注意unzip默認即為解壓操作
-f //注意與 tar 命令不同,unzip指定 -f 參數時,則將磁盤上已經存在且內容新於對應磁盤文件的壓縮內容解壓出來 -n //解壓縮時不覆蓋已存在的文件(而是跳過)
-q //安靜模式,僅解壓縮而不輸出詳細信息
-d dir //將文件解壓至dir指定的文件夾中
可以使用unzip命令對zip文件進行相關的操作。
(1)查看壓縮文件的所有文件名(注意 -Z 選項表示之后所有的參數被視為 zipinfo 的參數並輸出相應結果) -> unzip -Z1 file.zip
(2)測試文件的完整性 -> unzip -t file.zip
(3)將文件解壓至當前用戶的主目錄 -> unzip -q file.zip -d ~
ubuntu環境下,默認的系統配置無法處理 rar 壓縮文件,可通過包管理工具 apt 安裝和卸載 rar 壓縮文件的相關命令 rar 。
sudo apt-get install rar //安裝 rar sudo apt-get remove rar //卸載 rar
rar 命令的使用方法可參見 rar 的 man page。簡單而言,rar 命令包括 command 、switch 和 target 三個部分,其中 command 指定當前 rar 命令的行為,switch 可用於指定其某部分功能的啟停,而 target 則指定命令的操作對象。
基本格式:rar <command> [-<switch>] file.rar [files][path] command: //指定 rar 命令執行的具體動作 a //若指定的 file.rar 文件不存在,則將 files 指定的文件添加(壓縮)至 file.rar 中 e //解壓文件至當前目錄,注意所有的文件均被解壓至當前目錄,原有的目錄結構不會被保留 l //列出壓縮文件的內容,與 v 基本相同,但不包括文件路徑 t //測試壓縮文件 v //顯示壓縮文件的詳細資料 x //將文件解壓至 path 指定的路徑下 switch: //針對 rar 某部分功能的啟停,每個 switch 以 - 開始,通過空格鍵隔開 -r //對子目錄遞歸使用 -o+ //覆蓋已存在的文件 -o- //不覆蓋已存在的文件 -x<file> //去除指定的文件
使用舉例:
rar a -r experiment.rar ~/experiment/ //將目錄 ~/experiment/ 添加(壓縮)至文件 experiment.rar 文件,注意這里要使用 -r ,否則只會添加 ~/experiment/ 目錄下的所有文件,而不會處理其中的子目錄的內容
rar l experment.rar //查看 rar 文件的信息
rar x experment.rar ~/test/ //將文件 experiment.rar 文件解壓至指定的文件夾
該部分參考:讓Ubuntu 16.04可以壓縮/解壓縮RAR文件
Ubuntu 環境下默認不包含對 .7z 壓縮文件的處理程序,需要用戶自行安裝對應的壓縮/解壓工具,這里筆者使用的是 p7zip 工具。通過 apt install 安裝對應的工具。
sudo apt install p7zip //安裝 7-zip 工具
在安裝完成后,可以直接使用 p7zip 命令對文件進行操作,其為一個用於 7-zip 格式處理的腳本,僅能處理 7z 格式的文件,其主要功能通過在內部執行 7za 或 7zr 命令實現。
p7zip 命令的用法:
基本格式:p7zip [options][ file ] //沒有 options 參數時,p7zip 默認將每一個輸入的 file 參數壓縮為 file.7z 文件,並刪除源文件 -d //執行解壓操作,對應的文件參數應以 .7z 作為后綴,解壓后源壓縮文件會被刪除 -k //不刪除輸入文件,即進行壓縮/解壓時不會刪除源文件
使用實例:
p7zip a.txt b.txt //將生成兩個壓縮文件 a.txt.7z 和 b.txt.7z
p7zip -d -k a.txt.7z //解壓源文件 a.txt.7z,並保留該壓縮文件
7zr 命令的用法:
p7zip 命令的基礎功能實際上可由 7zr 命令實現,7zr 命令可提供更大自由度的操作,下面時關於該命令的簡單記錄。
基本用法: 7zr <command> <switches> <archive_name><file_names> command: //command 用於指定命令的動作,包括解壓,壓縮等 a //添加文件至壓縮文件 d //從壓縮文件中刪除文件 e //解壓縮文件(這里默認不保持原目錄結構) l //顯示壓縮文件內容 x //解壓文件,解壓會保持完整的路徑結構 switches: //switches 可指定一些額外的參數 -ai //處理時包括某些壓縮文件 -ax //處理時不包括某些壓縮文件 -o //設置壓縮/解壓結果的輸出目錄 -sdel //壓縮完成后刪除源文件
具體的詳細介紹可參見 7zr 的 man page。
