一、Linux常用压缩工具:
gzip、bzip、xz,这几个压缩工具不能压缩目录
-------------------------------------------------
gzip、bzip、xz的压缩比:xz>bzip>gzip
压缩比通常有1-9,9个级别,命令不指定压缩级别时,默认使用级别6;压缩比越大则越消耗cpu资源,压缩后的文件也约小,可使用参数,如:-4,指定压缩比级别;
gzip、bzip2、xz压缩包的后缀名:.gz、.bz2、.xz,例如:将文件test压缩后,压缩包名字为test.gz
gzip、bzip2、xz解压缩命令:gunzip = gzip -d、bunzip2 = bzip2 -d、unxz = xz –d
默认情况下,压缩文件后,源文件会被删除,bzip2、xz可以使用参数-k,达到压缩文件并不删除源文件的目的,gzip则可以通过输出重定向:gzip –c file > file.gz来达到目的
如果不解压,查看压缩包文件内容则使用以下命令
*.gz使用:zcat
*.bz2使用:bzcat
*.xz使用:xzcat
-------------------------------------------------
由于不能直接压缩目录,所以我们需要将目录归档(archive)成单个文件后,再进行压缩
二、Linux常用归档命令:
tar命令:
常用参数
-c:创建归档
-x:展开归档
-f filename:指定归档后的文件名称,一般以*.tar作为文件名
-t:不展开归档,查看归档文件列表
-C:指定归档展开后的路径
目录可以先归档成文件后,调用压缩工具进行压缩
-z:调用gzip进行压缩
-j:调用bzip2进行压缩
-J:调用xz进行压缩
--xattrs:归档后保留文件的扩展属性
[root@TESTHOST scripts]# cp -r /etc/init/ ./ #复制init目录到当前目录[root@TESTHOST scripts]# ls123 123.xz init[root@TESTHOST scripts]# tar -cf test.tar init #将init目录归档为test.tar[root@TESTHOST scripts]# ls123 123.xz init test.tar[root@TESTHOST scripts]# tar -tvf test.tar #查看归档明细 drwxr-xr-x root/root 0 2015-04-12 02:02 init/-rw-r--r-- root/root 430 2015-04-12 02:02 init/rcS-emergency.conf······ #省略······[root@TESTHOST scripts]# ls /tmp/yum.log- - - - - - - - - - - - - - - - - - -[root@TESTHOST scripts]# tar -xf test.tar -C /tmp #指定展开归档到/tmp目录下[root@TESTHOST scripts]# ls /tmp/init yum.log- - - - - - - - - - - - - - - - - - -[root@TESTHOST scripts]# tar -Jcf test1.tar.xz init/r* #归档并压缩[root@TESTHOST scripts]# ls123 123.xz init test1.tar.xz test.tar[root@TESTHOST scripts]# tar -Jxf test1.tar.xz -C /tmp #解压并展开,此处的J可以省去,tar命令会根据压缩格式自动调用压缩工具进行解压[root@TESTHOST scripts]# ls /tmp/init/rc.conf rcS.conf rcS-emergency.conf rcS-sulogin.conf
zip命令:同时归档、压缩,后缀名为.zip,解压缩命令为unzip,unzip -v能在不解压的情况下查看压缩包中文件明细
[root@TESTHOST scripts]# ls123 123.xz init[root@TESTHOST scripts]# zip -r test.zip init #如果要直接压缩目录,则需要-r进行递归操作,少了-r就目录写为init/*或这init/r*(目录中r开头的文件) adding: init/ (stored 0%) adding: init/rcS-emergency.conf (deflated 34%) adding: init/quit-plymouth.conf (deflated 37%) adding: init/start-ttys.conf (deflated 33%)······ #省略······[root@TESTHOST scripts]# ls123 123.xz init test.zip- - - - - - - - - - - - - - - -[root@TESTHOST scripts]# unzip -v test.zip #unzip -v 能查在不解压的情况下查看压缩包文件明细Archive: test.zip Length Method Size Cmpr Date Time CRC-32 Name-------- ------ ------- ---- ---------- ----- -------- ---- 0 Stored 0 0% 04-12-2015 02:44 00000000 init/ 430 Defl:N 283 34% 04-12-2015 02:44 d32c7c59 init/rcS-emergency.conf······ #省略······-------- ------- --- ------- 7946 4676 41% 15 files[root@TESTHOST scripts]#
三、练习
练习1:写一个脚本,能接受参数gzip、bzip2或xz,而后能将/etc/目录归档备份至/backup目录,并以参数指定的形式压缩存放;文件名称包含脚本执行时刻的时间
脚本1:
#!/bin/bash# Date: 2015-04-11# Description:# Version: 1.0if [ ! -e /backup ];then #这里可以用[ -d /backup ] || mkdir /backup 替代 mkdir /backupfiif [ $1 == gzip ];then tar czfP /backup/backupfile-`date +%F-%H-%M-%S`.tar.gz /etc/ #加-P的原因看下文 [ $? -eq 0 ] && echo "Backup etc successfully.(gzip)"elif [ $1 == bzip2 ];then tar cjfP /backup/backupfile-`date +%F-%H-%M-%S`.tar.bz2 /etc/ [ $? -eq 0 ] && echo "Backup etc successfully.(bzip2)"elif [ $1 == xz ];then tar cJfP /backup/backupfile-`date +%F-%H-%M-%S`.tar.xz /etc/ [ $? -eq 0 ] && echo "Backup etc successfully.(xz)"else echo "Usage:`basename $0`{gzip | bzip2 | xz }." exit 5fi
脚本2
#!/bin/bash# Date: 2015-04-11# Description:# Version: 1.0if [ ! -e /backup ];then #这里可以用[ -d /backup ] || mkdir /backup 替代 mkdir /backupfiCommand=$1if [ -z $1 ]; then #如果脚本给定的是空值,则默认输入gzip Command=gzipfiif [ $Command == gzip ];then tar czfP /backup/backupfile-`date +%F-%H-%M-%S`.tar.gz /etc/ [ $? -eq 0 ] && echo "Backup etc successfully.(gzip)"elif [ $Command == bzip2 ];then tar cjfP /backup/backupfile-`date +%F-%H-%M-%S`.tar.bz2 /etc/ [ $? -eq 0 ] && echo "Backup etc successfully.(bzip2)"elif [ $Command == xz ];then tar cJfP /backup/backupfile-`date +%F-%H-%M-%S`.tar.xz /etc/ [ $? -eq 0 ] && echo "Backup etc successfully.(xz)"else echo "Usage:`basename $0`{gzip | bzip2 | xz }." exit 5fi
关于-P参数:
因为tar命令打包时使用了绝对路径,没有-P参数时,执行命令时会有警告信息:
tar:Removing leading '/' from member names 或者 tar:从成员名中删除开头的“/”
示例1:
[root@TESTHOST scripts]# tar zvcf init.tar /etc/init/r*tar: 从成员名中删除开头的“/” #警告信息/etc/init/rc.conf/etc/init/rcS.conf/etc/init/rcS-emergency.conf/etc/init/rcS-sulogin.conf[root@TESTHOST scripts]# tar tvf init.tar -rw-r--r-- root/root 417 2013-10-10 22:48 etc/init/rc.conf #可以看到这里的etc前已经没有“/”-rw-r--r-- root/root 1046 2013-10-10 22:48 etc/init/rcS.conf-rw-r--r-- root/root 430 2013-10-10 22:48 etc/init/rcS-emergency.conf-rw-r--r-- root/root 725 2013-10-10 22:48 etc/init/rcS-sulogin.conf[root@TESTHOST scripts]# tar xvf init.tar #直接解包etc/init/rc.confetc/init/rcS.confetc/init/rcS-emergency.confetc/init/rcS-sulogin.conf[root@TESTHOST scripts]# ls #归档中所有文件被解压到当前目录,而非其原始位置123 123.xz etc init init.tar test.zip zipbackup.sh
通常是在两台环境相似的机器上进行同步复制的时候,才有需要使用绝对路径进行打包
上述情况我们在解包时可以使用参数并指定目录“-C /”,或者在进行归档或解包时都加上“-P”,
示例2:
[root@TESTHOST scripts]# tar czvfP /scripts/test.tar.gzip /scripts/test/ #无警告/scripts/test//scripts/test/file3/scripts/test/file1/scripts/test/file2[root@TESTHOST scripts]# tar tvfP /scripts/test.tar.gzipdrwxr-xr-x root/root 0 2015-04-12 06:03 /scripts/test/ #此时可以看到归档对象目录名是绝对路径-rw-r--r-- root/root 0 2015-04-12 06:03 /scripts/test/file3-rw-r--r-- root/root 0 2015-04-12 06:03 /scripts/test/file1-rw-r--r-- root/root 0 2015-04-12 06:03 /scripts/test/file2[root@TESTHOST scripts]# rm -rf test[root@TESTHOST scripts]# ls123 123.xz etc init init.tar test.tar.gzip zipbackup.sh[root@TESTHOST scripts]# tar xvfP /scripts/test.tar.gzip/scripts/test//scripts/test/file3/scripts/test/file1/scripts/test/file2[root@TESTHOST scripts]# ls #两次ls,查看目录文件,确认归档文件解包后,是直接放在源目录下的123 123.xz etc init init.tar test test.tar.gzip zipbackup.sh