开源 编程 nginx Ubuntu linux java mysql 微软 Firefox php Python centos wordpress shell 程序员 Android 云计算 apache google Windows

《循序漸進Linux(第2版) 基礎知識 服務器搭建 系統管理 性能調優 虛擬化與集群應用》——4.4 壓縮與解壓

4.4 壓縮與解壓

4.4.1 zip/unzip命令
1.功能說明
將一般的文件或者目錄進行壓縮或者解壓,默認生成以“.zip”為後綴的壓縮包。zip命令類似於Windows中的winzip壓縮程序。其格式如下。

zip [選項] 壓縮文件名需要壓縮的文檔列表
unzip [選項] 壓縮文件名
zip命令的選項及其說明如表4.27所示。


screenshot
screenshot

2.舉例
1)將/etc 目錄下的所有文件以及目錄進行壓縮,設置壓縮級別為最高,保存到文件/opt/etc.zip。

[root@mylinux ~]# zip -9r /opt/etc.zip /etc
2)將/var目錄中所有文件以及子目錄壓縮,除了“*.log”文件之外,將壓縮文件保存到/opt目錄下。

[root@mylinux ~]#zip –r /opt/var.zip /var –x "*.log"
3)將上面/opt/etc.zip中的etc/passwd文件從壓縮包中刪除。

[root@mylinux ~]#zip /opt/etc.zip–d etc/passwd
deleting:etc/passwd
4)修改了/etc/inittab文件,希望把更改信息更新到/opt/etc.zip包中。

[root@mylinux ~]#zip –u /opt/etc.zip /etc/inittab
如果/etc目錄下很多文件進行了修改或者增加了很多文件,就需要把/etc目錄下的全部信息更新到/opt/etc.zip文件。可以使用以下命令。

[root@mylinux ~]#zip –u /opt/etc.zip /etc/* 或者使用
[root@mylinux ~]#zip–ru /opt/etc.zip /etc
看出點玄機了嗎?在上例中,其實“/etc/*”就代表了/etc目錄下的所有文件以及子目錄,而這剛好是zip命令“-r”選項完成的功能。

5)將/opt/etc.zip壓縮文件全部解壓到/etc目錄下,除了etc/inittab文件之外,並且在解壓過程中如果出現相同的文件就直接進行覆蓋,不要求用戶確認。可以使用以下命令。

[root@mylinux ~]#unzip –o /opt/etc.zip –x etc/inittab –d /etc
4.4.2 gzip/gunzip命令
1.功能說明
將一般的文件進行壓縮或者解壓。壓縮文件預設的擴展名為“.gz”,其實gunzip就是gzip的硬鏈接,因此無論是壓縮或者解壓都可以通過gzip來實現。

註意
 gzip只能對文件進行壓縮,不能壓縮目錄,即使指定壓縮的目錄,也只能壓縮目錄內的所有文件。
其格式如下。

gzip [選項] 壓縮(解壓縮)的文檔名
2.舉例
1)首先將/etc目錄下的所有文件以及子目錄進行壓縮,備份壓縮包etc.zip到/opt目錄,然後對etc.zip文件進行gzip壓縮,設置gzip的壓縮級別為9。

[root@mylinux ~]#zip –r /opt/etc.zip /etc
[root@mylinux ~]#gzip -9v /opt/etc.zip
etc.zip:     6.5% -- replaced with etc.zip.gz
2)查看上述etc.zip.gz文件的壓縮信息。

[root@mylinux ~]# gzip -l /opt/etc.zip.gz 
compressed    uncompressed ratio uncompressed_name
      11938745      12767265  6.5% /opt/etc.zip
3)解壓上述etc.zip.gz文件到當前目錄。

[root@mylinux ~]#gzip –d /opt/etc.zip.gz或者執行
[root@mylinux ~]#gunzip /opt/etc.zip.gz
通過上面的示例可以知道“gzip -d”等價於“gunzip”命令。

4.4.3 bzip2/bunzip2命令
1.功能說明
對文件進行壓縮與解壓縮。此命令類似於“gzip/gunzip”命令,只能對文件進行壓縮。對於目錄只能壓縮目錄下的所有文件,壓縮完成後,在目錄下生成以“.bz2”為後綴的壓縮包。bunzip2其實是bzip2的符號鏈接,即軟鏈接,因此壓縮、解壓都可以通過bzip2實現。其格式如下。

bzip2 [選項] 要壓縮或解壓的文件
2.舉例
將/opt目錄下的etc.zip、var.zip和backup.zip進行壓縮,設置壓縮率為最高,同時在壓縮完畢後不刪除原始文件,顯示壓縮過程的詳細信息。

[root@mylinux~]# bzip2 -9vk/opt/etc.zip /opt/var.zip /opt/backup.zip   
etc.zip: 1.048:1, 7.633 bits/byte, 4.59% saved, 49490414 in, 4721194 out.
var.zip: 1.048:1, 7.633 bits/byte, 4.59% saved, 49490414 in, 2821065 out.
backup.zip: 1.046:1,7.647 bits/byte, 4.42% saved, 8410 in, 8823 out.
壓縮完畢後,在/opt下就會生成相應的etc.zip.bz2、var.zip.bz2和backup.zip.bz2文件。

4.4.4 tar命令
1.功能說明
tar是Linux下經常使用的歸檔工具,對文件或者目錄進行打包歸檔,歸檔成一個文件,但是並不進行壓縮。其格式如下。

tar [主選項+輔助選項] 文件或者目錄
tar命令的選項很多,這裏列出一些經常用到的主選項,如表4.31所示。

screenshot

2.舉例
1)將/etc目錄下的所有文件打包,並顯示打包的詳細文件,設置打包文件名為etc.tar,同時保存文件到/opt目錄下。

[root@dbbackup oracle]#tar -cvf /opt/etc.tar /etc
這裏的檔案名“etc.tar”名字是我們自己隨便取的,Linux上利用tar命令打包出來的檔案文件一般用.tar作為標識。

2)將/etc目錄下的所有文件打包並壓縮,然後顯示打包的詳細文件,設置打包文件名為etc.tar.gz,同時保存文件到/opt目錄下。

[root@dbbackup oracle]#tar -zcvf /opt/etc.tar.gz /etc
[root@dbbackup oracle]#tar -jcvf /opt/etc.tar.bz2 /etc
“zcvf”選項表示在打包完成後調用gzip命令對檔案文件進行壓縮,這裏的檔案名“etc.tar.gz”也是我們隨便取的,“.tar”表示是用tar命令打包的,“.gz”表示調用了gzip命令進行了壓縮。同理,“jcvf”選項表示在打包完成後調用bzip2命令對檔案文件進行壓縮,檔案命名標識中“.bz2”表示調用了bzip2命令進行了壓縮處理。

這裏對檔案文件的取名沒有硬性的規定,上面采用的命名規則,可以很方便地讓我們知道文件的類型以及對應的解壓方式,因為壓縮方式不同,解壓方式也是不同的。同時,這種規則也是默許的一種潛規則。如果你不喜歡這種規則,完全可以按照自己喜歡的方式命名檔案文件。

3)查閱上面/opt/etc.tar.gz壓縮包的內容。

[root@dbbackup oracle]#tar -ztvf /opt/etc.tar.gz
[root@dbbackup oracle]#tar -jtvf /opt/etc.tar.gz
註意
 “etc.tar.gz”可能包含很多個文件,無法一個屏幕顯示完畢,這時可以使用more命令,比如,“tar -zxvf /opt/etc.tar.gz|more”。
4)將/opt/etc.tar.gz解壓到/usr/local/src下。

[root@dbbackup oracle]#cd /usr/local/src
[root@dbbackup src]#tar -zxvf /opt/etc.tar.gz
一般情況下,可以把/opt/etc.tar.gz在任何地方解壓,這裏首先切換到了/usr/local/src目錄下,然後解壓/opt/etc.tar.gz,因此/usr/local/src/etc目錄就是解壓的目錄。

5)將/etc目錄下的所有文件打包備份到/opt目錄下,並保存每個文件的權限。

[root@dbbackup oracle]#tar -zcvpf /opt/etc.tar.gz /etc
6)在/opt目錄下,僅解壓/opt/etc.tar.gz壓縮文件中的/etc/inittab文件。

[root@dbbackup oracle]# cd /opt
[root@dbbackup opt]#tar -zxvf /opt/etc.tar.gz etc/inittab
首先可以通過“tar-ztvf”查看“etc.tar.gz”文件中包含的文件,然後找到需要解壓的文件,通過上面的方式解壓。後面指定的需要解壓出來的文件一定要是通過“tar -ztvf”顯示出來的文件完整路徑。這樣就在/opt目錄下解壓出了一個etc目錄,而etc目錄下的inittab就是我們需要的文件。

7)打包備份/var/log目錄中2008/7/21以後的文件。

[root@dbbackup oracle]#tar –N "2008/7/21"–zcvf log.tar.gz /var/log
[root@dbbackup oracle]#pwd
/opt/oracle
[root@dbbackup oracle]#ls
log.tar.gz
8)打包備份/home目錄和/etc目錄,但是不備份/home下的ixdba目錄。

[root@dbbackuporacle]#tar–exclude/home/ixdba -zcvf myfile.tar.gz /home/* /etc
9)將/etc目錄打包壓縮後直接解壓到/opt目錄下,而不生成打包的檔案文件。

[root@dbbackuporacle]#cd /opt
[root@dbbackupopt]#tar –zcvf - /etc | tar –zxvf –
在上面的命令中,緊跟在“f”後面的“-”將創建的檔案文件輸出到標準輸出,“|”在Linux下表示管道符,命令最後的“-”表示將tar命令通過管道傳入的檔案文件作為需要解壓的數據來源。

4.4.5 dd命令
1.功能說明
dd命令用來轉換或復制文件,同時可以對設備進行備份。其格式如下。

dd if="input_file" of="output_file" bs="block_size" count="number"
dd命令的選項及其說明如下。

if:就是輸入文件,可以是設備,例如,磁盤某分區或者整個磁盤。
of:就是輸出文件,也可以是輸出設備,例如,磁盤、磁帶等。
bs:指定一個block的大小,如果沒有指定,默認為512字節。
count:就是“bs”的數量。
2.舉例
1)將/etc/inittab文件備份到/opt/inittab.bak中。

[root@mylinux ~]# dd if=/etc/inittab of=/opt/inittab.bak
3+1 records in
3+1 records out
[root@mylinux ~]#ls –al /etc/inittab/opt/inittab.bak
-rw-r--r-- 1 root root 1666 Jul 22 17:37 /etc/inittab
-rw-r--r-- 1 root root 1666 Jul 23 08:09 /opt/inittab.bak
上面兩個文件的大小沒有任何異同,都是1666字節。由於沒有指定“bs”大小,因此默認512字節為一個單位塊,剛好對應上面的“3+1”。3表示有3個完整的512字節的塊,而“1”表示未滿512字節的那個塊。

2)將/dev/sda2整個分區進行備份,保存備份文件到/opt目錄。

[root@mylinux ~]# dd if=/dev/sda2 of=/opt/sda2.back
這裏將磁盤某個分區的數據全部備份,dd命令還能夠備份整個磁盤的數據,這裏的備份輸出路徑一定不能是“/dev/sda2”所在分區,否則怎麽都備份不完的。

3)將上面例子中的備份包/opt/sda2.back恢復到相應的分區,使用以下命令。

[root@mylinux ~]#dd if=/opt/sda2.back of=/dev/sda2
註意
 在恢復目標分區時,一定要先卸載目標分區,待恢復完成,再進行掛載。
還需要註意的是,備份的分區最好和恢復的分區一致,例如,本例中“/opt/sda6.back”文件是對“/dev/sda2”分區的備份,那麽恢復的時候最好將“/opt/sda6.back”文件恢復到“/dev/sda2”分區下,或者恢復到大小與“/dev/sda2”一致的分區下。因為恢復的目標分區如果大於備份的分區,將浪費空間;相反,若恢復的目標分區小於備份的分區,就將在恢復的時候提示空間不足。

4.4.6 cpio命令
1.功能說明
cpio命令是通過重定向的方式將文件進行打包、備份、還原、恢復的工具,它可以解壓以“.cpio”或者“.tar”結尾的文件。其格式如下。

cpio [選項] >文件名或者設備名
cpio [選項] <文件名或者設備名
2.舉例
1)將/etc下的所有普通文件都備份到/opt/etc.cpio中。

[root@mylinux ~]#find /etc –type f | cpio –ocvB >/opt/etc.cpio
2)將系統上所有資料備份到磁帶機內。

[root@mylinux ~]#find / -print | cpio -covB > /dev/st0
這裏的“/dev/st0”是磁帶的設備名,代表SCSI磁帶機。

3)查看上例磁帶機上備份的文件。

[root@mylinux ~]#cpio -icdvt < /dev/st0
有時可能因為備份的文件過多,一個屏幕無法顯示完畢,此時利用下面的命令,讓磁帶機的文件信息輸出到文件。

[root@mylinux ~]#cpio -icdvt < /dev/st0> /tmp/st_content
4)將示例1)中的備份包還原到相應的位置,如果有相同文件就進行覆蓋。

[root@mylinux ~]#cpio –icduv < /opt/etc.cpio
註意
 如果cpio在打包、備份的時候用的是絕對路徑,那麽在恢復的時候會自動恢復到這些絕對路徑下,本例就會將備份文件全部還原到/etc路徑下對應的目錄中。同理,如果在打包備份時用的是相對路徑,那麽還原時也將恢復到相對路徑下。
通過上面的示例可以看出,cpio無法直接讀取文件,它需要每個文件或者目錄的完整路徑名才能識別、讀取,而find命令的輸出剛好做到了這點,因此cpio命令一般和find命令配合使用。其實,上面的示例中我們已經看到了它們的組合用法。

延伸阅读

    评论