首页 > 代码库 > 第8章:Shell脚本归档与压缩
第8章:Shell脚本归档与压缩
第8章:Shell脚本归档与压缩
定期备份不可小视,我们可以通过shell脚本来实现备份自动化。其中数据备份一般要使用到归档与压缩,归档与压缩对于系统管理员或普通用户来说是比较常用的工具,有许多不同的压缩格式,要结合不同的使用方法才可以获得最佳的压缩效果。还有文件加密也是一种保护数据常用的方法,文件加密之前通常都要先进行归档和压缩。
8.1、tar 归档
tar命令主要用来归档文件,可以用tar将多个文件和文件夹保存为单个文件,同时还能保留所有文件的属性、权限等。
范例1:创建tar归档
[root@cloucentos6 home]# tar --help | grep ‘\-f\,‘
-f, --file=ARCHIVE 使用归档文件或 ARCHIVE 设备
[root@cloucentos6 home]# tar --help | grep "\-c\," #查看系统tar帮助 –c选项的说明
-c, --create 创建一个新归档
[root@cloucentos6 home]# for((i=1;i<4;i++));do ifconfig > font$i.txt;done #使用for循环创建3个测试文本
[root@cloucentos6 home]# ls font*
font1.txt font2.txt font3.txt
[root@cloucentos6 home]# tar -cf font.tar font1.txt font2.txt font3.txt
范例2:查看归档及追加归档文件
[root@cloucentos6 home]# tar --help | grep ‘\-v\,‘
-v, --verbose 详细地列出处理的文件
[root@cloucentos6 home]# tar --help | grep ‘\-r\,‘
-r, --append 追加文件至归档结尾
[root@cloucentos6 home]# tar -tf font.tar #查看归档文件
font1.txt
font2.txt
font3.txt
[root@cloucentos6 home]# tar -rvf font.tar font4.txt
font4.txt
[root@cloucentos6 home]# tar -tf font.tar
font1.txt
font2.txt
font3.txt
font4.txt
[root@cloucentos6 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:从归档文件中提取文本或文件夹
[root@cloucentos6 home]# tar --help | grep ‘\-x\,‘
-x, --extract, --get 从归档中解出文件
[root@cloucentos6 home]# tar --help | grep ‘\-C\,‘
-C, --directory=DIR 改变至目录 DIR
[root@cloucentos6 home]# tar -xf font.tar
[root@cloucentos6 home]# ls
font1.txt font2.txt font3.txt font4.txt font.tar lost+found test.sh
[root@cloucentos6 home]# tar -xf font.tar -C /mnt
[root@cloucentos6 home]# ls /mnt/
font1.txt font2.txt font3.txt font4.txt
[root@cloucentos6 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
[root@cloucentos6 home]# tar -xvf font.tar font2.txt
font2.txt
范例4:两个tar归档文件进行合并
[root@cloucentos6 home]# tar --help | grep "\-A\,"
-A, --catenate, --concatenate 追加 tar 文件至归档
[root@cloucentos6 home]# tar -cf test01.tar font1.txt font2.txt
[root@cloucentos6 home]# tar -cf test02.tar font3.txt font4.txt
[root@cloucentos6 home]# tar -Af test01.tar test02.tar #把test02.tar文件合并到test01.tar
范例5:从归档文件中删除文件
[root@cloucentos6 home]# tar --help | grep "\-delete"
--delete 从归档(非磁带!)中删除
[root@cloucentos6 home]# tar -tf test01.tar
font1.txt
font2.txt
font3.txt
font4.txt
[root@cloucentos6 home]# tar --delete --file test01.tar font2.txt
[root@cloucentos6 home]# tar -tf test01.tar
font1.txt
font3.txt
font4.txt
范例6:tar 命令把文件进行归档和压缩,-z对.gz压缩格式,-j对bz2压缩格式
[root@cloucentos6 home]# tar -zcvf file.tar.gz font1.txt font3.txt font4.txt
font1.txt
font3.txt
font4.txt
[root@cloucentos6 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命令解压归档文件
[root@cloucentos6 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
[root@cloucentos6 home]# gzip font1.txt
[root@cloucentos6 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解压会删除原压缩文件解压出文件
[root@cloucentos6 home]# gunzip font1.txt.gz
[root@cloucentos6 home]# ls -l font1.txt
-rw-r--r--. 1 root root 884 4月 29 18:27 font1.txt
范例3:gzip -l 选项查看压缩文件属性信息
[root@cloucentos6 home]# gzip -l font1.txt.gz
compressed uncompressed ratio uncompressed_name
401 884 58.7% font1.txt
范例4:将font4.txt内容输入,gzip打包输出重写向到test.gz
[root@cloucentos6 home]# cat font4.txt | gzip -c > test.gz
范例5:先使用tar进行归档再进行gzip压缩
[root@cloucentos6 home]# tar -cvf file.tar font3.txt font4.txt
font3.txt
font4.txt
[root@cloucentos6 home]# gzip file.tar
[root@cloucentos6 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
[root@cloucentos6 home]# ls -l file.tar.gz
-rw-r--r--. 1 root root 515 4月 29 23:35 file.tar.gz
[root@cloucentos6 home]# gunzip file.tar.gz
[root@cloucentos6 home]# ls -l file.tar
-rw-r--r--. 1 root root 10240 4月 29 23:35 file.tar
[root@cloucentos6 home]# tar -xvf file.tar
font3.txt
font4.txt
8.3、bzip2压缩与bunzip2解压
Bunzip2是另一种与bzip类似的压缩技术,压缩格式后缀.bz2
范例1:bzip2默认会删除原文件生成一个压缩文件font3.txt.bz2
[root@cloucentos6 home]# bzip2 font3.txt
[root@cloucentos6 home]# ls -l font3.txt.bz2
-rw-r--r--. 1 root root 462 4月 29 18:27 font3.txt.bz2
范例2:bunzip2解压会删除原压缩文件解压出文件
[root@cloucentos6 home]# bunzip2 font3.txt.bz2
[root@cloucentos6 home]# ls -l font3.txt
-rw-r--r--. 1 root root 884 4月 29 18:27 font3.txt
范例3:将font3.txt内容输入,bzip2打包输出重写向到test.bz2
[root@cloucentos6 home]# cat font3.txt | bzip2 -c > test.bz2
范例4:先使用tar进行归档再进行bzip2压缩
[root@cloucentos6 home]# tar -cvf file.tar font3.txt
[root@cloucentos6 home]# ls -l file.tar
-rw-r--r--. 1 root root 10240 4月 30 00:16 file.tar
[root@cloucentos6 home]# bzip2 file.tar
[root@cloucentos6 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
[root@cloucentos6 home]# ls -l file.tar.bz2
-rw-r--r--. 1 root root 545 4月 30 00:16 file.tar.bz2
[root@cloucentos6 home]# bunzip2 file.tar.bz2
[root@cloucentos6 home]# ls -l file.tar
-rw-r--r--. 1 root root 10240 4月 30 00:16 file.tar
[root@cloucentos6 home]# tar -xvf file.tar
font3.txt
8.4、zip归档和压缩
zip作为一种流行的压缩格式,在gzip或bzip2使用没那么广泛,但在因特网上的文件通常都采用这种格式。
范例1:zip压缩不会删除原文件, -r 选项对目录和文件进行递归压缩。
[root@cloucentos6 home]# zip file.zip font3.txt
adding: font3.txt (deflated 58%)
[root@cloucentos6 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%)
[root@cloucentos6 home]# ls -l file.zip
-rw-r--r--. 1 root root 1704 4月 30 00:46 file.zip
范例2:unzip从zip文件中提取内容,完成之后不会删除zip压缩
[root@cloucentos6 home]#unzip file.zip
Archive: file.zip
creating: file/
extracting: file/file.zip
creating: file/abc/
extracting: file/abc/file.zip
范例3: -u 选项更新压缩归档文件内容, -d 删除压缩归档文件中的删除内容
[root@cloucentos6 home]# zip file.zip -u font4.txt #更新
adding: font4.txt (deflated 58%)
[root@cloucentos6 mnt]# zip -d file.zip /file/abc/file.zip #删除指定压缩归档文件目录下的文件
deleting: file/abc/file.zip
8.5、加密工具与散列
范例1:gpg加密和解密文本,它采用密钥签名技术保护文件内容。
[root@cloucentos6 home]# gpg -c font4.txt #提示输入加密密码
[root@cloucentos6 home]# ls -l font4.txt.gpg
-rw-r--r--. 1 root root 429 4月 30 01:36 font4.txt.gpg
[root@cloucentos6 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字符串。
[root@cloucentos6 home]# cat file.txt
abc123
abc123
abc123
[root@cloucentos6 home]# base64 file.txt > outputfile.txt #加密生成outputfile.txt加密文件
[root@cloucentos6 home]# cat outputfile.txt
YWJjMTIzCmFiYzEyMwphYmMxMjMK
[root@cloucentos6 home]# base64 -d outputfile.txt > jiemifile.txt #解密outputfile.txt生成jimifile.txt解密文件
[root@cloucentos6 home]# cat jiemifile.txt
abc123
abc123
abc123
8.6、raync备份系统快照
rsync 可以对位于不同位置的文件和目录进行备份,它可以借助差异计算以及压缩技术来最小化数据传输量。rsync还还支持网络数据传输,rsync还会比较源端和目的端的文件,只有文件有更新时才进行复制。
范例1:将源目录复制到目的端 , -a 选项归档, -v 显示细节信息或进度
标注:路径格式而言,如果/bin末尾使用/,rsync会将/bin/目录中的所有文件复制至目的端。如果/bin没有使用 / ,rsync会将/bin目录本身复制至目的端。
[root@cloucentos6 home]# rsync -av /bin/ /home/file #将/bin/目录中的文件复制到/home/file目录下
[root@cloucentos6 home]# rsync -av /bin /home/ #将/bin目录复制到/home/目录下
[root@cloucentos6 home]# rsync –av /bin/ root@192.168.10.10:/home/file #将/bin/目录复制到远程主机/home/file目录下
范例2: --exclude 排除不在归档范围内的部分文件
[root@cloucentos6 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分区,使用备份恢复分区。
[root@cloucentos6 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
[root@cloucentos6 home]# dd if=/dev/sda1 of=/home/sda1_boot.img #备份分区
记录了1024000+0 的读入
记录了1024000+0 的写出
524288000字节(524 MB)已复制,35.5123 秒,14.8 MB/秒
[root@cloucentos6 home]# ls -l sda1_boot.img
-rw-r--r--. 1 root root 524288000 5月 3 17:31 sda1_boot.img
[root@cloucentos6 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’
[root@cloucentos6 home]# dd if=/dev/zero of=/dev/sda1
范例3:在容量相同的硬盘间进行克隆,/dev/sda是原数据端,/dev/sdb目的数据端。
[root@cloucentos6 home]# dd if=/dev/sda of=/dev/sdb
[root@cloucentos6 home]# dd if=/dev/cdrom of=cdrom.iso #制作CD ROM的镜像(ISO文件)
第8章:Shell脚本归档与压缩