Linux檔案壓縮與打包

來源:互聯網
上載者:User

被壓縮過的檔案,通常其附檔名都是『 *.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2 』 等等的,當你捉到某個壓縮檔時, 就需要知道壓縮他的是那個指令,好用來對照著解壓縮.目前一些常常見到的壓縮檔案的附檔名:

*.Z        compress 程式壓縮的檔案;
*.bz2         bzip2 程式壓縮的檔案;
*.gz         gzip 程式壓縮的檔案;
*.tar         tar 程式打包的資料,並沒有壓縮過;
*.tar.gz    tar 程式打包的檔案,其中並且經過 gzip 的壓縮

最早期的要算是 compress 這個傢伙了,不過這個 compress 指令目前已經不再是預設的壓縮軟體了而後,後來的 GNU 計劃開發出新一代的壓縮指令 gzip ( GNU zip ) 用來取代 compress 這個老牌的壓縮指令,再來還有 bzip2 這個更好的壓縮指令.不過,這些指令通常僅能針對一個檔案來壓縮與解壓縮,若每次壓縮與解壓縮都要一大堆檔案,豈不煩人?此時,那個所謂的『打包軟體』就顯的很重要。

tar 可以將很多檔案『打包』成為一個檔案! 甚至是目錄也可以這麼玩。不過,單純的 tar 功能僅是『打包』而已,亦即是將很多檔案集結成為一個檔案,事實上,他並沒有提供壓縮的功能,後來, GNU 計劃中,將整個 tar 與壓縮的功能結合在一起,如此一來提供使用者更方便並且更強大的壓縮與打包功能!

底下我們就來談一談這些在 Linux 底下基本的壓縮指令吧!

1) compress

[root@linux ~]# compress [-dcr] 檔案或目錄
參數:
-d :用來解壓縮的參數
-r :可以連同目錄下的檔案也同時給予壓縮呢!
-c :將壓縮資料輸出成為 standard output (輸出到螢幕)

範例:

範例一:將 /etc/man.config 複製到 /tmp ,並加以壓縮
[root@linux ~]# cd /tmp
[root@linux tmp]# cp /etc/man.config .
[root@linux tmp]# compress man.config
[root@linux tmp]# ls -l
-rw-r--r-- 1 root root 2605 Jul 27 11:43 man.config.Z

範例二:將剛剛的壓縮檔解開
[root@linux tmp]# compress -d man.config.Z

範例三:將 man.config 壓縮成另外一個檔案來備份
[root@linux tmp]# compress -c man.config > man.config.back.Z
[root@linux tmp]# ll man.config*
-rw-r--r-- 1 root root 4506 Jul 27 11:43 man.config
-rw-r--r-- 1 root root 2605 Jul 27 11:46 man.config.back.Z

# 這個 -c 的參數比較有趣!他會將壓縮過程的資料輸出到螢幕上,而不是寫入成為
# file.Z 檔案。所以,我們可以透過資料流重導向的方法將資料輸出成為另一個檔名。
# 關於資料流重導向,我們會在 bash shell 當中詳細談論的啦

這是用來壓縮與解壓縮附檔名為 *.Z 的指令!所以看到 *.Z 的檔案時,就應該要知道他是經由 compress 這個程式壓縮的呦!當你以 compress 壓縮之後,如果沒有下達其它的參數,那麼原本的檔案就會被後來的 *.Z 所取代!以上面的案例來說明:原本壓縮的檔案為 man.config ,那麼當壓縮完成之後,將只會剩下 man.config.Z 這個經過壓縮的檔案囉!那麼解壓縮呢?呵呵,則是將 man.config.Z 解壓縮成 man.config ! 使用上很簡單啦!

解壓縮除了可以使用 compress –d 這個參數之外,也可以直接使用 uncompress !意思相同啦! 另外,如果不想讓原本的檔案被更名成為 *.Z ,而想製作出另外的一個檔名時,就可以利用資料流重導向, 亦即是那個大於 (>) 的符號,將原本應該在螢幕上面出現的資料給他儲存到其它檔案去。 當然,這要加上 -c 的參數才行~關於資料流重導向,我們會在第三篇提到的!

此外, compress 已經很少人在使用了, 因為這支程式無法解開 *.gz 的檔案,而 gzip 則可以解決 *.Z 的檔案, 所以,如果您的 distribution 上面沒有 compress 的話,沒有關係的喔!

2) gzip, zcat

[root@linux ~]# gzip [-cdt#] 檔名
[root@linux ~]# zcat 檔名.gz
參數:
-c :將壓縮的資料輸出到螢幕上,可透過資料流重導向來處理;
-d :解壓縮的參數;
-t :可以用來檢驗一個壓縮檔的一致性~看看檔案有無錯誤;
-# :壓縮等級,-1 最快,但是壓縮比最差、-9 最慢,但是壓縮比最好!預設是 -6

範例:

範例一:將 /etc/man.config 複製到 /tmp ,並且以 gzip 壓縮
[root@linux ~]# cd /tmp
[root@linux tmp]# cp /etc/man.config .
[root@linux tmp]# gzip man.config
# 此時 man.config 會變成 man.config.gz !

範例二:將範例一的檔案內容讀出來!
[root@linux tmp]# zcat man.config.gz
# 此時螢幕上會顯示 man.config.gz 解壓縮之後的檔案內容!!

範例三:將範例一的檔案解壓縮
[root@linux tmp]# gzip -d man.config.gz

範例四:將範例三解開的 man.config 用最佳的壓縮比壓縮,並保留原本的檔案
[root@linux tmp]# gzip -9 -c man.config > man.config.gz

gzip 是用來壓縮與解壓縮附檔名為 *.gz 的指令!另外, gzip 也提供 壓縮比的服務! -1 是最差的壓縮比,但是壓縮速度最快,而 -9雖然可以達到較佳的壓縮比 (經過壓縮之後,檔案比較小一些!) ,但是卻會損失一些速度!預設是 -6 這個數值!
gzip 也是相當常使用的一個壓縮指令呢! 至於 zcat 則是用來讀取壓縮檔資料內容的指令!假如我們剛剛壓縮的檔案是一個文字檔案, 那麼你還記得如何讀取文字檔案嗎?!沒錯!就是使用 cat ,那麼讀取壓縮檔呢?呵呵!就是使用 zcat 囉!

gzip 這個壓縮指令主要想要用來取代 compress 的,所以 compress 的壓縮檔案也可以使用 gzip 來解開喔! zcat 這個指令可以同時讀取 compress 與 gzip 的壓縮檔.

3)  bzip2, bzcat

[root@linux ~]# bzip2 [-cdz] 檔名
[root@linux ~]# bzcat 檔名.bz2
參數:
-c :將壓縮的過程產生的資料輸出到螢幕上!
-d :解壓縮的參數
-z :壓縮的參數
-# :與 gzip 同樣的,都是在計算壓縮比的參數, -9 最佳, -1 最快!

範例:

範例一:將剛剛的 /tmp/man.config 以 bzip2 壓縮
[root@linux tmp]# bzip2 -z man.config
# 此時 man.config 會變成 man.config.bz2 !

範例二:將範例一的檔案內容讀出來!
[root@linux tmp]# bzcat man.config.bz2
# 此時螢幕上會顯示 man.config.bz2 解壓縮之後的檔案內容!!

範例三:將範例一的檔案解壓縮
[root@linux tmp]# bzip2 -d man.config.bz2

範例四:將範例三解開的 man.config 用最佳的壓縮比壓縮,並保留原本的檔案
[root@linux tmp]# bzip2 -9 -c man.config > man.config.bz2

使用 compress 附檔名自動建立為 .Z ,使用 gzip 附檔名自動建立為 .gz 。這裡的 bzip2 則是自動的將附檔名建置為 .bz2 囉!所以當我們使用具有壓縮功能的 bzip2 -z 時,那麼剛剛的 man.config 就會自動的變成了 man.config.bz2 這個檔名囉! 好了,那麼如果我想要讀取這個檔案的內容呢? 是否一定要解開?當然不需要囉!可以使用簡便的 bzcat 這個指令來讀取內容即可!例如上面的例子中, 我們可以使用 bzcat man.config.bz2 來讀取資料而不需要解開!此外,當您要解開一個壓縮檔時, 這個檔案的名稱為 .bz, .bz2, .tbz, .tbz2 等等,那麼就可以嘗試使用 bzip2 來解看看啦!

4) tar

[root@linux ~]# tar [-cxtzjvfpPN] 檔案與目錄 ....

參數:

-c :建立一個壓縮檔案的參數指令(create 的意思);
-x :解開一個壓縮檔案的參數指令!
-t :查看 tarfile 裡面的檔案!
特別注意,在參數的下達中, c/x/t 僅能存在一個!不可同時存在!因為不可能同時壓縮與解壓縮。

-z :是否同時具有 gzip 的屬性?亦即是否需要用 gzip 壓縮?
-j :是否同時具有 bzip2 的屬性?亦即是否需要用 bzip2 壓縮?
-v :壓縮的過程中顯示檔案!這個常用,但不建議用在背景執行過程!

-f :使用檔名,請留意,在 f 之後要立即接檔名喔!不要再加參數!
例如使用『 tar -zcvfP tfile sfile』就是錯誤的寫法,要寫成『 tar -zcvPf tfile sfile』才對喔!

-p :使用原檔案的原來屬性(屬性不會依據使用者而變)
-P :可以使用絕對路徑來壓縮!
-N :比後面接的日期(yyyy/mm/dd)還要新的才會被打包進建立的檔案中!
--exclude FILE:在壓縮的過程中,不要將 FILE 打包!

範例:

範例一:將整個 /etc 目錄下的檔案全部打包成為 /tmp/etc.tar
[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==僅打包,不壓縮!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包後,以 gzip 壓縮
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包後,以 bzip2 壓縮
# 特別注意,在參數 f 之後的檔案檔名是自己取的,我們習慣上都用 .tar 來作為辨識。
# 如果加 z 參數,則以 .tar.gz 或 .tgz 來代表 gzip 壓縮過的 tar file ~
# 如果加 j 參數,則以 .tar.bz2 來作為附檔名啊~
# 上述指令在執行的時候,會顯示一個警告訊息:
# 『tar: Removing leading `/' from member names』那是關於絕對路徑的特殊設定。

範例二:查閱上述 /tmp/etc.tar.gz 檔案內有哪些檔案?
[root@linux ~]# tar -ztvf /tmp/etc.tar.gz
# 由於我們使用 gzip 壓縮,所以要查閱該 tar file 內的檔案時,
# 就得要加上 z 這個參數了!這很重要的!

範例三:將 /tmp/etc.tar.gz 檔案解壓縮在 /usr/local/src 底下
[root@linux ~]# cd /usr/local/src
[root@linux src]# tar -zxvf /tmp/etc.tar.gz
# 在預設的情況下,我們可以將壓縮檔在任何地方解開的!以這個範例來說,
# 我先將工作目錄變換到 /usr/local/src 底下,並且解開 /tmp/etc.tar.gz ,
# 則解開的目錄會在 /usr/local/src/etc 呢!另外,如果您進入 /usr/local/src/etc
# 則會發現,該目錄下的檔案屬性與 /etc/ 可能會有所不同喔!

範例四:在 /tmp 底下,我只想要將 /tmp/etc.tar.gz 內的 etc/passwd 解開而已
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -zxvf /tmp/etc.tar.gz etc/passwd
# 我可以透過 tar -ztvf 來查閱 tarfile 內的檔案名稱,如果單只要一個檔案,
# 就可以透過這個方式來下達!注意到! etc.tar.gz 內的根目錄 / 是被拿掉了!

範例五:將 /etc/ 內的所有檔案備份下來,並且儲存其許可權!
[root@linux ~]# tar -zcvpf /tmp/etc.tar.gz /etc
# 這個 -p 的屬性是很重要的,尤其是當您要保留原本檔案的屬性時!

範例六:在 /home 當中,比 2005/06/01 新的檔案才備份
[root@linux ~]# tar -N '2005/06/01' -zcvf home.tar.gz /home

範例七:我要備份 /home, /etc ,但不要 /home/dmtsai
[root@linux ~]# tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

範例八:將 /etc/ 打包後直接解開在 /tmp 底下,而不產生檔案!
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -cvf - /etc | tar -xvf -
# 這個動作有點像是 cp -r /etc /tmp 啦~依舊是有其有用途的!
# 要注意的地方在於輸出檔變成 - 而輸入檔也變成 - ,又有一個 | 存在~
# 這分別代表 standard output, standard input 與管線命令啦!
# 這部分我們會在 Bash shell 時,再次提到這個指令跟大家再解釋囉!

這是一個多用途的壓縮指令:

tar 可以將整個目錄或者是指定的檔案都整合成一個檔案!例如上面的範例一,他可以將 /etc 底下的檔案全部整合成一個檔案!
同時, tar 可以配合 gzip (這個 gzip 的功能已經已經附加上 tar 裡面去了) ,同時整合并壓縮!呵呵!很方便吧!
『 tar 用來作備份是很重要的指令! 』而由於 tar 整合過後的檔案我們通常會取名為 *.tar ,而如果還含有 gzip 的壓縮屬性,那麼就取名為 *.tar.gz 囉!只是為了方便我們記憶這個檔案是什麼屬性罷了!並沒有實際的意義在!

絕對路徑與許可權的問題

另外,需要注意的是,在使用的參數方面,有還有幾個有用的參數需要來瞭解一番,亦即是 -p 與 -P 這兩個!在我們的範例一當中,有提到一個警告訊息,那就是『 tar: Removing leading `/' from member names』 意思是說, tar 將 /etc 目錄的那個 / 拿掉了!這是因為擔心未來你在解開壓縮的時候,會產生一些困擾, 因為在 tar 裡面的檔案如果是具有『絕對路徑』的話,那麼你解開的檔案將會『一定』在該路徑下也就是 /etc,而不是相對路徑 (這裡請用心的想一想!) 。 這樣子的最大困擾是,萬一有人拿走了你的這個檔案,並且將該檔案在他的系統上面解開!萬一他的系統上面正巧也有 /etc 這個目錄 (那當然是一定有的啊!),他的檔案就會被覆蓋了!

在預設的情況中,如果是以『絕對路徑』來建立打包檔案,那麼 tar 將會自動的將 / 拿掉!這是為了剛剛說明的『安全』為前提所做的預設值。要以絕對路徑來建立打包的檔案!那麼就加入 -P 這個參數吧 (請注意!是大寫字元) ! 那麼 -p (小寫字母)是什麼  ?呵呵!那個 -p 是 permission 的意思,也就是『許可權』啦!使用 -p 之後,被打包的檔案將不會依據使用者的身份來改變許可權喔!

關於檔案的更新日期:

這裡還有一個值得注意的參數呦!那就是在備份的情況中很常使用的 -N 的這個參數! 你可以參考一下上面的例子就可以知道啦!在這個例子當中,相當重要的就是那個日期啦! 在備份的情況當中,我們都希望只要備份較新的檔案就好了,為什麼呢?因為舊的檔案我們已經有備份囉! 幹嘛還要再備份一次,浪費時間也浪費系統資源!這個時候此一參數就顯的相當的重要了啊!

關於 standard input/standard output:
在上面的例子中,最後一個例子很有趣『tar cvf - /etc | tar -xvf - 』!他是直接以管線命令『 pipe 』來進行壓縮、解壓縮的過程!在上面的例子中,我們想要『將 /etc 底下的資料直接 copy 到目前所在的路徑,也就是 /tmp 底下來』,但是又覺得使用 cp -r 有點麻煩,那麼就直接以這個打包的方式來打包,其中,指令裡面的 - 就是表示那個被打包的檔案啦!由於我們不想要讓中間檔案存在,所以就以這一個方式來進行複製的行為啦!

什麼是 tarfile 與 tarball?
tar 的功能相當的多,而由於他是經由『打包』之後再處理的一個過程,所以常常我們會聽到 tarball 的檔案,那就是經由 tar 打包再壓縮的檔案啦! 而如果僅是打包而沒有壓縮的話,我們就稱為 tarfile 囉~此外, tar 也可以用在備份的儲存媒體上面,最常見的就是磁帶機了!假設我的磁帶機代號為 /dev/st0 ,那麼我要將我的 /home 底下的資料都給他備份上去時,就是使用 tar /dev/st0 /home 就可以啦!很不錯吧!
在 Linux 當中, gzip 已經被整合在 tar 裡面了!但是 Sun 或者其它較舊的 Unix 版本中, 當中的 tar 並沒有整合 gzip ,所以如果你需要解壓縮的話,就需要這麼做:
gzip -d testing.tar.gz tar -xvf testing.tar
第一個步驟會將檔案解壓縮,第二個步驟才是將資料解出來!與其它壓縮程式不太一樣的是, bzip2, gzip 與 compress 在沒有加入特殊參數的時候,原先的檔案會被取代掉,但是使用 tar 則原來的與後來的檔案都會存在呦!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.