標籤:one put bsp 壓縮 rect 許可權 .gz mnt gzip
第8章:Shell指令碼歸檔與壓縮
定期備份不可小視,我們可以通過shell指令碼來實現備份自動化。其中資料備份一般要使用到歸檔與壓縮,歸檔與壓縮對於系統管理員或普通使用者來說是比較常用的工具,有許多不同的壓縮格式,要結合不同的使用方法才可以獲得最佳的壓縮效果。還有檔案加密也是一種保護資料常用的方法,檔案加密之前通常都要先進行歸檔和壓縮。
8.1、tar 歸檔
tar命令主要用來歸檔檔案,可以用tar將多個檔案和檔案夾儲存為單個檔案,同時還能保留所有檔案的屬性、許可權等。
範例1:建立tar歸檔
[[email protected] home]# tar --help | grep ‘\-f\,‘
-f, --file=ARCHIVE 使用歸檔檔案或 ARCHIVE 裝置
[[email protected] home]# tar --help | grep "\-c\," #查看系統tar協助 –c選項的說明
-c, --create 建立一個新歸檔
[[email protected] home]# for((i=1;i<4;i++));do ifconfig > font$i.txt;done #使用for迴圈建立3個測試文本
[[email protected] home]# ls font*
font1.txt font2.txt font3.txt
[[email protected] home]# tar -cf font.tar font1.txt font2.txt font3.txt
範例2:查看歸檔及追加歸檔檔案
[[email protected] home]# tar --help | grep ‘\-v\,‘
-v, --verbose 詳細地列出處理的檔案
[[email protected] home]# tar --help | grep ‘\-r\,‘
-r, --append 追加檔案至歸檔結尾
[[email protected] home]# tar -tf font.tar #查看歸檔檔案
font1.txt
font2.txt
font3.txt
[[email protected] home]# tar -rvf font.tar font4.txt
font4.txt
[[email protected] home]# tar -tf font.tar
font1.txt
font2.txt
font3.txt
font4.txt
[[email protected] home]# tar -tvf font.tar #查看更加詳細的歸檔檔案
-rw-r--r-- root/root 10240 2017-04-29 18:05 font1.txt
-rw-r--r-- root/root 884 2017-04-29 18:03 font2.txt
-rw-r--r-- root/root 884 2017-04-29 18:03 font3.txt
-rw-r--r-- root/root 884 2017-04-29 18:14 font4.txt
範例3:從歸檔檔案中提取文本或檔案夾
[[email protected] home]# tar --help | grep ‘\-x\,‘
-x, --extract, --get 從歸檔中解出檔案
[[email protected] home]# tar --help | grep ‘\-C\,‘
-C, --directory=DIR 改變至目錄 DIR
[[email protected] home]# tar -xf font.tar
[[email protected] home]# ls
font1.txt font2.txt font3.txt font4.txt font.tar lost+found test.sh
[[email protected] home]# tar -xf font.tar -C /mnt
[[email protected] home]# ls /mnt/
font1.txt font2.txt font3.txt font4.txt
[[email protected] home]# tar -tvf font.tar
-rw-r--r-- root/root 884 2017-04-29 18:27 font1.txt
-rw-r--r-- root/root 884 2017-04-29 18:27 font2.txt
-rw-r--r-- root/root 884 2017-04-29 18:27 font3.txt
-rw-r--r-- root/root 884 2017-04-29 18:27 font4.txt
[[email protected] home]# tar -xvf font.tar font2.txt
font2.txt
範例4:兩個tar歸檔檔案進行合并
[[email protected] home]# tar --help | grep "\-A\,"
-A, --catenate, --concatenate 追加 tar 檔案至歸檔
[[email protected] home]# tar -cf test01.tar font1.txt font2.txt
[[email protected] home]# tar -cf test02.tar font3.txt font4.txt
[[email protected] home]# tar -Af test01.tar test02.tar #把test02.tar檔案合并到test01.tar
範例5:從歸檔檔案中刪除檔案
[[email protected] home]# tar --help | grep "\-delete"
--delete 從歸檔(非磁帶!)中刪除
[[email protected] home]# tar -tf test01.tar
font1.txt
font2.txt
font3.txt
font4.txt
[[email protected] home]# tar --delete --file test01.tar font2.txt
[[email protected] home]# tar -tf test01.tar
font1.txt
font3.txt
font4.txt
範例6:tar 命令把檔案進行歸檔和壓縮,-z對.gz壓縮格式,-j對bz2壓縮格式
[[email protected] home]# tar -zcvf file.tar.gz font1.txt font3.txt font4.txt
font1.txt
font3.txt
font4.txt
[[email protected] home]# ls -l | head -n 3
-rw-r--r--. 1 root root 589 4月 29 22:59 file.tar.gz
-rw-r--r--. 1 root root 45 4月 29 22:56 font1.txt
範例7:tar命令解壓歸檔檔案
[[email protected] home]# tar -zxvf file.tar.gz
font1.txt
font3.txt
font4.txt
8.2、gzip壓縮與gunzip解壓
gzip只能夠壓縮單個檔案,而無法對目錄和多個檔案進行歸檔,因些需要tar進行歸檔後再使用gzip進行壓縮,產生壓縮格式尾碼為.gz
範例1:gzip預設會刪除原檔案產生一個壓縮檔test01.tar.gz
[[email protected] home]# gzip font1.txt
[[email protected] home]# ls -l
-rw-r--r--. 1 root root 401 4月 29 18:27 font1.txt.gz
-rw-r--r--. 1 root root 884 4月 29 18:27 font3.txt
範例2:gunzip解壓會刪除原壓縮檔解壓出檔案
[[email protected] home]# gunzip font1.txt.gz
[[email protected] home]# ls -l font1.txt
-rw-r--r--. 1 root root 884 4月 29 18:27 font1.txt
範例3:gzip -l 選項查看壓縮檔屬性資訊
[[email protected] home]# gzip -l font1.txt.gz
compressed uncompressed ratio uncompressed_name
401 884 58.7% font1.txt
範例4:將font4.txt內容輸入,gzip打包輸出重寫向到test.gz
[[email protected] home]# cat font4.txt | gzip -c > test.gz
範例5:先使用tar進行歸檔再進行gzip壓縮
[[email protected] home]# tar -cvf file.tar font3.txt font4.txt
font3.txt
font4.txt
[[email protected] home]# gzip file.tar
[[email protected] home]# ls -l file.tar.gz
-rw-r--r--. 1 root root 515 4月 29 23:35 file.tar.gz
範例6:先gzip進行解壓.gz再使用tar解壓tar
[[email protected] home]# ls -l file.tar.gz
-rw-r--r--. 1 root root 515 4月 29 23:35 file.tar.gz
[[email protected] home]# gunzip file.tar.gz
[[email protected] home]# ls -l file.tar
-rw-r--r--. 1 root root 10240 4月 29 23:35 file.tar
[[email protected] home]# tar -xvf file.tar
font3.txt
font4.txt
8.3、bzip2壓縮與bunzip2解壓
Bunzip2是另一種與bzip類似的壓縮技術,壓縮格式尾碼.bz2
範例1:bzip2預設會刪除原檔案產生一個壓縮檔font3.txt.bz2
[[email protected] home]# bzip2 font3.txt
[[email protected] home]# ls -l font3.txt.bz2
-rw-r--r--. 1 root root 462 4月 29 18:27 font3.txt.bz2
範例2:bunzip2解壓會刪除原壓縮檔解壓出檔案
[[email protected] home]# bunzip2 font3.txt.bz2
[[email protected] home]# ls -l font3.txt
-rw-r--r--. 1 root root 884 4月 29 18:27 font3.txt
範例3:將font3.txt內容輸入,bzip2打包輸出重寫向到test.bz2
[[email protected] home]# cat font3.txt | bzip2 -c > test.bz2
範例4:先使用tar進行歸檔再進行bzip2壓縮
[[email protected] home]# tar -cvf file.tar font3.txt
[[email protected] home]# ls -l file.tar
-rw-r--r--. 1 root root 10240 4月 30 00:16 file.tar
[[email protected] home]# bzip2 file.tar
[[email protected] home]# ls -l file.tar.bz2
-rw-r--r--. 1 root root 545 4月 30 00:16 file.tar.bz2
範例5:先bzip2進行解壓.bz2再使用tar解壓tar
[[email protected] home]# ls -l file.tar.bz2
-rw-r--r--. 1 root root 545 4月 30 00:16 file.tar.bz2
[[email protected] home]# bunzip2 file.tar.bz2
[[email protected] home]# ls -l file.tar
-rw-r--r--. 1 root root 10240 4月 30 00:16 file.tar
[[email protected] home]# tar -xvf file.tar
font3.txt
8.4、zip歸檔和壓縮
zip作為一種流行的壓縮格式,在gzip或bzip2使用沒那麼廣泛,但在網際網路上的檔案通常都採用這種格式。
範例1:zip壓縮不會刪除原檔案, -r 選項對目錄和檔案進行遞迴壓縮。
[[email protected] home]# zip file.zip font3.txt
adding: font3.txt (deflated 58%)
[[email protected] home]# zip -r file.zip file/
adding: file/ (stored 0%)
adding: file/file.zip (stored 0%)
adding: file/abc/ (stored 0%)
adding: file/abc/file.zip (stored 0%)
[[email protected] home]# ls -l file.zip
-rw-r--r--. 1 root root 1704 4月 30 00:46 file.zip
範例2:unzip從zip檔案中提取內容,完成之後不會刪除zip壓縮
[[email protected] home]#unzip file.zip
Archive: file.zip
creating: file/
extracting: file/file.zip
creating: file/abc/
extracting: file/abc/file.zip
範例3: -u 選項更新壓縮歸檔檔案內容, -d 刪除壓縮歸檔檔案中的刪除內容
[[email protected] home]# zip file.zip -u font4.txt #更新
adding: font4.txt (deflated 58%)
[[email protected] mnt]# zip -d file.zip /file/abc/file.zip #刪除指定壓縮歸檔檔案目錄下的檔案
deleting: file/abc/file.zip
8.5、加密工具與散列
範例1:gpg加密和解密文本,它採用密鑰簽名技術保護檔案內容。
[[email protected] home]# gpg -c font4.txt #提示輸入加密密碼
[[email protected] home]# ls -l font4.txt.gpg
-rw-r--r--. 1 root root 429 4月 30 01:36 font4.txt.gpg
[[email protected] home]# gpg font4.txt.gpg #輸入解密密碼進行解密
gpg: 3DES 加密過的資料
can‘t connect to `/root/.gnupg/S.gpg-agent‘: 沒有那個檔案或目錄
agpg: 以 1 個密碼加密
gpg: 警告:報文未受到完整的保護
範例2:base64是一組類似編碼方案,它通過將ASCII字元轉換成以64為基數的形式來用ASCII字串描述位元據。Base64可以用來對編碼和解碼base64字串。
[[email protected] home]# cat file.txt
abc123
abc123
abc123
[[email protected] home]# base64 file.txt > outputfile.txt #加密產生outputfile.txt加密檔案
[[email protected] home]# cat outputfile.txt
YWJjMTIzCmFiYzEyMwphYmMxMjMK
[[email protected] home]# base64 -d outputfile.txt > jiemifile.txt #解密outputfile.txt產生jimifile.txt解密檔案
[[email protected] home]# cat jiemifile.txt
abc123
abc123
abc123
8.6、raync備份系統快照
rsync 可以對位於不同位置的檔案和目錄進行備份,它可以藉助差異計算以及壓縮技術來最小化資料轉送量。rsync還還支援網路資料轉送,rsync還會比較源端和目的端的檔案,只有檔案有更新時才進行複製。
範例1:將來源目錄複製到目的端 , -a 選項歸檔, -v 顯示細節資訊或進度
標註:路徑格式而言,如果/bin末尾使用/,rsync會將/bin/目錄中的所有檔案複製至目的端。如果/bin沒有使用 / ,rsync會將/bin目錄本身複製至目的端。
[[email protected] home]# rsync -av /bin/ /home/file #將/bin/目錄中的檔案複製到/home/file目錄下
[[email protected] home]# rsync -av /bin /home/ #將/bin目錄複寫到/home/目錄下
[[email protected] home]# rsync –av /bin/ [email protected]:/home/file #將/bin/目錄複寫到遠程主機/home/file目錄下
範例2: --exclude 排除不在歸檔範圍內的部分檔案
[[email protected] home]# rsync -av /bin /home/ --exclude “*.txt”
8.7、dd命令複製磁碟
dd命令是同硬碟和分區打交道時,我們可能需要建立所有分區的副本或備份,而不僅僅是複製內容(不僅是各個硬碟分區,而且還包括引志記錄、分區表等資訊)。這時,我們就可以使用dd命令,它能夠用於複製任何類型的磁碟,如果硬碟、快閃記憶體、CD、DVD等。
dd格式如下:
dd if=source of=target bs=block_size count=count
其中:
if 代表輸入檔案或輸入裝置路徑
of 代表目標檔案或目標裝置路徑
bs 代表塊大小(通常以2的冪數形式給出,如果512 、1024、2048等)。Count是需要複製的塊數。
需要複製的位元組總數=塊大小 * count
通過指定count,我們可以限制從輸入檔案複製至目標的位元組數。如果不指定count,dd命令會對輸入檔案進行複製,直到遇見檔案結束標誌(EOF)為止。
範例1:備份sda1分區,使用備份恢複分區。
[[email protected] home]# df -h
檔案系統 容量 已用 可用 已用%% 掛載點
/dev/sda2 97G 4.5G 87G 5% /
tmpfs 996M 112K 996M 1% /dev/shm
/dev/sda1 485M 30M 430M 7% /boot
/dev/sda3 58G 188M 55G 1% /home
/dev/sr0 4.0G 4.0G 0 100% /media/CentOS_6.0_Final
[[email protected] home]# dd if=/dev/sda1 of=/home/sda1_boot.img #備份分區
記錄了1024000+0 的讀入
記錄了1024000+0 的寫出
524288000位元組(524 MB)已複製,35.5123 秒,14.8 MB/秒
[[email protected] home]# ls -l sda1_boot.img
-rw-r--r--. 1 root root 524288000 5月 3 17:31 sda1_boot.img
[[email protected] home]# dd if=/home/sda1_boot.img of=/dev/sda1 #恢複分區
記錄了1024000+0 的讀入
記錄了1024000+0 的寫出
524288000位元組(524 MB)已複製,9.14704 秒,57.3 MB/秒
範例2:永久刪除一個分區中所有資料,使用dd向該分區中寫入0傎,/dev/zero是一個字元裝置,它總是會返回字元 ’\0’
[[email protected] home]# dd if=/dev/zero of=/dev/sda1
範例3:在容量相同的硬碟間進行複製,/dev/sda是原資料端,/dev/sdb目的資料端。
[[email protected] home]# dd if=/dev/sda of=/dev/sdb
[[email protected] home]# dd if=/dev/cdrom of=cdrom.iso #製作CD ROM的鏡像(ISO檔案)
第8章:Shell指令碼歸檔與壓縮