一、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