本文是筆者對鳥叔的Linux私房菜(基礎學習篇) 第三版(中文網站)中關於 Linux 環境下打包和解壓縮指令的內容以及平常操做過程當中所接觸的相關指令的總結和記錄,以供備忘和分享。更多詳細信息可直接參考對應Linux命令的 man 幫助( 如 man tar)。php
在Linux環境下,對於文件的操做更多經過命令行指令而不是單純的鼠標點擊,而文件管理中一個重要的操做即是壓縮和加壓操做。經過文件的壓縮和解壓,可使得文件佔用更少的存儲空間,也可讓文件傳輸更加便捷。本文主要介紹Linux下經常使用的打包指令和解壓縮指令,並介紹不一樣的壓縮文件拓展名的區別。linux
索引git
隨着壓縮技術的發展,Linux環境下提供的壓縮指令和格式開始變多。爲了便於用戶區分不一樣壓縮文件使用的不一樣壓縮技術,進而使用合適的指令進行操做,通常使用後綴標識文件在壓縮或打包過程當中所使用的壓縮技術。常見的後綴有如下幾種: ubuntu
*.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、bzip二、tar、unzip、unrar 等指令是在打包和壓縮過程當中較爲經常使用的指令。工具
gzip測試
gzip能夠壓縮產生後綴爲 .gz 的壓縮文件,也能夠用於解壓gzip、compress等程序壓縮產生的文件。不帶任何選項和參數使用gzip或只帶有參數 - 時,gzip從標準輸入讀取輸入,並在標準輸出輸出壓縮結果。網站
gzip的經常使用指令選項以下: spa
基礎格式: 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。