我们在网络上下载的文件大都是经过压缩过的压缩文件,例如通过linux内核官网下载的linux内核文件往往是这样的: linux-2.6.1.tar.bz2、linux-2.6.1.tar.gz、linux-2.6.1.tar.xz。 文件后缀名为tar.bz2、tar.gz或者tar.xz,这是linux内核最经常用的三种压缩方式了。 为了节省磁盘空间,或者在通过网络传送文件的时候节省网络传输时间,经常需要将文件进行压缩。
在计算机中最小的容量单位是字节bytes,一个字节有8个bits位。每一位只可能是0或者1。 例如数字1在计算机中存储为00000001,1会在最右边占据1个bit,而剩下的7个bits都填充为0! 这样看来这七个bit其实是没有任何意义的,但是却浪费了7个bit的空间,所以利用相应的压缩算法将这些没有使用到的空间 丢出来,以让文件占用的空间变小!这就是压缩的技术啦!
另外一种压缩技术是将重复的数据进行统计记录的。举例来说,如果你的数据为111.... 共有100个1时, 那么压缩技术会记录为100个1,而不是真的有100个1的位存在!这样也能够精简文件记录的容量呢!
经过压缩后的文件是无法直接使用的,在使用之前,需要将文件数据还原回未压缩前的样子, 那就是解压缩的过程了! 压缩后与压缩前的文件所占用的磁盘空间大小称为压缩比! 由于目前的计算机指令周期相当的快速, 因此其实在网页浏览的时候,时间都是花在数据的传输上面,而不是 CPU 的运算啦! 为了提高数据传输效率,目前很多的WWW网站利用文件压缩的技术来进行数据的传送,在经过网络传输时,使用的是压缩过的数据, 等到这些压缩过的数据到达你的计算机主机时,再进行解压缩,这样由于压缩过的数据量降低了,自然传送的速度就会增快不少!网站带宽的可利用率上升喔!

Linux 系统常见的压缩指令

回到顶部

Linux文件的属性基本上是与文件名没有绝对关系的,虽然linux下的文件不通过文件扩展名区别文件的类型,但是由于linux下的压缩工具非常多, 且不同的压缩工具所用的压缩技术并不相同,彼此之间可能就无法互通压缩/解压缩文件。 所以,当你下载到某个压缩文件时,自然就需要知道该文件是由哪种压缩指令所制作出来的,好用来对照着解压缩啊! 所以需要通过不同的后缀扩展名来区分压缩文件。通过不同压缩工具压缩后的文件会有不同的后缀扩展名。
Linux下压缩文件常用的扩展名有如下几种:
*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2, *.xz。

*.Z compress程序压缩的文件;
*.zip zip程序压缩的文件;
*.tar tar程序打包的文件,但是没有压缩;
*.gz gzip程序压缩的文件;
*.bz2 bzip2程序压缩的文件;
*.xz xz程序压缩的文件;
*.tar.gz 先通过tar程序打包,然后经过gzip压缩的文件;
*.tar.bz2 先通过tar程序打包,然后经过bzip2压缩的文件;
*.tar.xz 先通过tar程序打包,然后经过xz压缩的文件
目前Linux上常见的压缩指令就是gzip, bzip2以及最新的xz。compress已经被gzip取代了。
为了支持windows常见的zip,其实Linux也早就有zip指令了!zip命令用于将文件或者目录压缩为.zip格式 gzip是由GNU计划所开发出来的压缩指令,该指令已经取代了compress。
后来GNU又开发出bzip2及xz这几个压缩比更好的压缩指令!
这些指令通常仅能针对一个文件来压缩与解压缩,打包软件tar可以将很多文件打包成为一个文件!甚至是目录也可以这么玩。
不过,单纯的tar功能仅是打包而已,亦即是将很多文件集结成为一个文件, 事实上,他并没有提供压缩的功能, 后来,GNU计划中,将整个tar与压缩的功能结合在一起,如此一来提供使用者更方便并且更强大 的压缩与打包功能! 下面我们就来谈一谈这些在Linux下面基本的压缩指令吧!

linux tar命令

回到顶部

gzip, bzip2和xz命令只能压缩单一文件,虽然可以对目录进行压缩,但是gzip, bzip2和xz命令是将目录内的所有文件分别进行压缩!
所以在用gzip, bzip2和xz压缩多个文件之前,需要将多个文件先打包成一个文件后再进行压缩。
tar命令可以先将多个目录或文件打包成一个大文件,然后通过gzip/bzip2/xz将该打包文件进行压缩!
一般将tar打包压缩后的文件称为tarball,例如file.tar.bz2,只打包但是没有压缩的文件称为tarfile,例如file.tar。
tar命令经常用于系统中重要文件目录的备份。
鉴于tar的广泛使用,Windows下的WinRAR也支持.tar.gz文件的解压缩!

1.tar命令

回到顶部

tar的常用选项与参数如下:

              #打包与压缩
              [peter@study ~]$ tar [-z|-j|-J] [cv] [-f 待建立的新文件名] filename...
              #察看文件名
              [peter@study ~]$ tar [-z|-j|-J] [tv] [-f 既有的 tar 文件名]
              #解压缩
              [peter@study ~]$ tar [-z|-j|-J] [xv] [-f 既有的 tar 文件名] [-C 目录]
              选项与参数:
              -c :建立打包文件,可搭配-v来察看过程中被打包的文件名(filename)
              -t :察看打包文件的内容含有哪些文件名,重点在察看文件名;
              -x :解打包或解压缩的功能,可以搭配-C(大写)在特定目录解开;
              特别留意的是, -c, -t, -x不可同时出现在一串命令列中。
              -z :使用gzip进行压缩或解压缩,文件名最好为*.tar.gz
              -j :使用bzip2进行压缩或解压缩,文件名最好为*.tar.bz2
              -J :使用xz进行压缩或解压缩,文件名最好为 *.tar.xz
              特别留意, -z, -j, -J 不可以同时出现在一串命令列中
              -v :在压缩/解压缩的过程中,将正在处理的文件名显示出来!
              -f filename :-f后面被处理的文件名!建议-f单独写一个选项!(比较不会忘记)
              -C 目录 :该选项用于解压缩,解压缩到指定的目录内。
              -p(小写) :保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件
              -P(大写) :保留绝对路径,亦即允许备份数据中含有根目录存在之意;
              --exclude=FILE:在压缩的过程中,不要将 FILE 打包!
            
其实最简单的使用 tar 就只要记忆下面的方式即可: tar常用的选项组合如下: 压缩:
              [peter@study ~]$ tar -jcv -f 压缩后的文件filename.tar.bz2 被压缩的文件或目录名称
            
解压缩:
              [peter@study ~]$ tar -jxv -f 解压文件filename.tar.bz2 -C 解压缩到该目录
            
查询:
              [peter@study ~]$ tar -jtv -f filename.tar.bz2
            
那个 filename.tar.bz2 是我们自己取的文件名,tar 并不会主动的产生建立的文件名喔!我们要自定义啦!
所以扩展名就显的很重要了!如果不加 [-z|-j|-J] 的话,文件名最好取为 *.tar 即可。
tar命令需要用户给出打包压缩后的文件名,如果只是打包而不压缩,只需使用-c选项即可,打包后的文件扩展名最好是*.tar;
如果需要打包完后再压缩,就在-c选项的基础上加上-z或者-j或者-J,分别使用gzip, bzip2和xz进行压缩。
-j选项使用bzip2压缩,文件名最好就取为*.tar.bz2;
-z选项使用gzip压缩,文件名最好取为*.tar.gz;
-J选项使用xz压缩,文件名最好取为*.tar.xz;
-f filename是紧接在一起的, 所以可以写成-jcvf filename, 但由于选项的顺序理论上是可以变换的,所以很多用户会误认为-jvfc filename也可以。事实上这样会导致tar产生的文件名变成c! 所以建议在使用tar的时候最好将-f filename与其他选项独立出来。
经常需要备份系统的/etc目录,可以使用tar进行备份。

2.使用gzip算法打包压缩

回到顶部

使用gzip算法打包压缩/etc目录,使用进行压缩,保留文件的原权限和属性,同时显示压缩过程信息:

              [root@initroot ~]# tar -zpcv -f /root/etc.tar.gz /etc
              tar: Removing leading `/' from member names
              /etc/
              /etc/machine-id
              /etc/udisks2/
              /etc/udisks2/udisks2.conf
              ...省略...
            
-v选项,可以将正在压缩的文件名显示在屏幕上。
-p选项保留原本文件的权限与属性。类似cp命令的-p选项,在备份重要的系统数据时,最好将原本文件的权限做完整的备份。

3.使用bzip2算法打包压缩

回到顶部

使用bzip2算法打包压缩/etc目录:

              [root@initroot ~] #tar -jpcv -f /root/etc.tar.bz2 /etc
              tar: Removing leading `/' from member names
              /etc/
              /etc/machine-id
              /etc/udisks2/
              ...省略...
            

4.使用xz算法打包压缩

回到顶部

使用xz算法打包压缩/etc目录:

              [root@initroot ~] #tar -Jpcv -f /root/etc.tar.xz /etc      
              tar: Removing leading `/' from member names
              /etc/
              /etc/machine-id
              /etc/udisks2/
              ...省略...
            
查看打包压缩后的文件大小:
              [root@initroot ~] # ls -lh /root/etc.tar.*
              -rw-r--r-- 1 root root 1.7M Mar  2 10:43 /root/etc.tar.bz2
              -rw-r--r-- 1 root root 1.9M Mar  2 10:38 /root/etc.tar.gz
              -rw-r--r-- 1 root root 1.4M Mar  2 10:45 /root/etc.tar.xz
            
/etc目录所占用的磁盘空间:
              [root@initroot ~]# du -sm /etc
              15	/etc/
            
/etc目录约占28MB磁盘空间!
可以明显看到使用不同压缩算法,压缩后的文件大小对比。最好的是xz,但是在使用不同压缩算法时候,可以明显感觉到压缩率越高,占用的时间越多。
可以在上面打包压缩命令的前面加上time命令,测试打包压缩所用的时间。只需看real就可以了,以为xz压缩为例:
              [root@initroot ~]# time tar -Jpcv -f /root/etc.tar.xz /etc
                tar: Removing leading `/' from member names
                /etc/
                /etc/machine-id
                /etc/udisks2/
                ...省略...
                /etc/mtab

                real	0m3.382s
                user	0m2.792s
                sys	0m0.155s
            
压缩比越好花费时间越多!。
使用tar打包压缩文件的时候会有警告信息tar: Removing leading `/' from member names
意思是在压缩的时候会将文件路径名最前面的/去掉,相当于只保留了文件的相对路径名。 去掉根目录是为了解压缩时候的数据安全, 例如在/tmp目录下解压缩,解压缩的文件名就会变成/tmp/etc/xxx。 如果没有去掉根目录,解压缩后的文件名会是绝对路径,就会覆盖掉/etc目录下的文件,这是非常危险的!
如果确定需要保留绝对路径,可以使用-P(大写)选项,将文件名中的根目录也备份下来:
              [root@initroot ~]# tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc
            
加上-P选项,文件名内的根目录就会存在!为了解压缩时的数据安全建议不要加上-P选项来备份! 如果需要覆盖掉/etc目录下的文件,只需要在该目录下解压缩即可,或者指定解压缩的目录。

5.查看压缩文件

回到顶部

可以使用-t选项查看打包压缩后的文件,-v选项可以列出详细的文件权限和属性,像ls一样列出压缩文件中的文件:

              [root@initroot ~]# tar -jtv -f /root/etc.tar.bz2
              drwxr-xr-x root/root         0 2020-01-19 18:11 etc/
              -r--r--r-- root/root        33 2019-07-29 18:28 etc/machine-id
              ...省略...
            
可以看到文件名前面没有根目录/,显示的是相对路径名。

6.tar命令解压

回到顶部

将打包压缩后的文件解压缩:

              [root@initroot ~]# tar -jxv -f /root/etc.tar.bz2
            
因为我们是在家目录下进行的解压缩操作,所以会将文件解压缩到家目录下。 如果想要解压到其他目录,只需要切换到相应目录,然后进行解压缩即可。也可以使用-C选项指定解压缩的目录:
              [root@initroot ~]# tar -jxv -f /root/etc.tar.bz2 -C /tmp
              [root@initroot ~]# ls -l /tmp
              ...省略...
              drwxr-xr-x. 131 root root 8192 Jun 26 22:14 etc
              ...省略...
            
注意在解压的时候,用什么算法压缩,就要用相应的算法解压。
例如上面的etc.tar.bz2文件在压缩的时候使用-j为bzip2方式压缩,那么解压的时候-x就需要配合-j来使用bzip2方式进行解压。
删除测试目录:
              [root@initroot ~]# rm -rf /root/etc /tmp/etc
            
rm -rf是很危险的命令!请务必要确认后面接的文件名。要删除的是/root/etc与/tmp/etc, 不要将/etc/删除掉了!
上面是将整个压缩文件解压缩,也可以解压压缩文件内指定的文件:
              [root@initroot ~]# tar -jxv -f 压缩文件.tar.bz2 待解压文件名
            
可以先利用-jtv选项配合grep找出想要解压的文件,然后再对该文件进行解压。
例如只想要解压shadow文件,先看看压缩文件中有没有shadow文件:
              [root@initroot ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
              ---------- root/root 721 2015-06-17 00:20 etc/gshadow
              ---------- root/root 1183 2015-06-17 00:20 etc/shadow-
              ---------- root/root 1210 2015-06-17 00:20 etc/shadow     #有!
              ---------- root/root 707 2015-06-17 00:20 etc/gshadow-
            
然后再解压shadow文件:
              [root@initroot ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
              etc/shadow
            
注意不要写成/etc/shadow!因为在etc.tar.bz2内并没有/!

7.tar命令--exclude选项

回到顶部

打包某目录,但不含该目录下的某些文件之作法
可以使用--exclude选项排除不需要打包的文件或目录。
假设想要打包/etc/和/root目录,但却不想要打包/root/etc*开头的文件,新打包文件为/root/system.tar.bz2:

              [root@initroot ~]# tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root
            
因为打包压缩后的文件system.tar.bz2存放在/root目录下,所以该文件也不需要打包,用--exclude排除掉。 上面的命令比较长,有可能一行放不下,可以使用换行符(\)+[enter]将命令接到下一行。
通过这个 --exclude="file" 的动作,我们可以将几个特殊的文件或目录移除在打包之列!

8.备份比某个时刻还要新的文件

回到顶部

某些情况下需要备份新的文件,并不想备份旧文件!
可以使用--newer或者--newer-mtime选项,当使用--newer时,表示后续的日期包含mtime与ctime,而--newer-mtime则仅包含mtime! 。
用find命令找出比/etc/passwd还要新的文件:

              [root@initroot ~]# find /etc -newer /etc/passwd
              ....省略...
            
此时会显示出比/etc/passwd文件的mtime还要新的文件名
              [root@initroot ~]# ll /etc/passwd
            -rw-r--r--. 1 root root 2020 Jun 17 00:20 /etc/passwd
            
使用tar来进行打包吧!日期为上面看到的 2020/06/17
              [root@initroot ~]# tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 --newer-mtime="2015/06/17" /etc/*
              tar: Option --newer-mtime: Treating date `2020/06/17' as 2020-06-17 00:00:00
              tar: Removing leading `/' from member names
              /etc/abrt/
              ...省略...
              /etc/alsa/
              /etc/yum.repos.d/
              ...省略...
              tar: /etc/yum.repos.d/CentOS-fasttrack.repo: file is unchanged; not dumped
            
最后一行显示的是没有被备份的,即not dumped!
显示出文件:
              [root@initroot ~]# tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 | grep -v '/$'
            
上面的命令可以调出tar.bz2内的非/结尾的文件名!就是我们需要的!
这个命令可以进行差异文件的记录与备份。
可以想象,如果在一个月前才进行过一次完整的数据备份, 这个月可以仅备份上个月进行备份的那个时间点之后的更新的文件即可!
只要备份新数据即可。可以降低备份的容量!

9.备份到特殊设备

回到顶部

tar命令除了可以将文件打包成为tarball或者tarfile外,还可以将文件打包到某些特殊设备中,例如磁带机(tape)。 由于磁带机是一次性读写设备,不能使用类似cp命令来复制! 如果想要将/home, /root, /etc备份到磁带机(/dev/st0):

              [root@initroot ~]# tar -cv -f /dev/st0 /home /root /etc
            

10.tar配合管道的使用

回到顶部

特殊应用:利用管线命令与数据流
在 tar 的使用中,有一种方式最特殊,那就是通过标准输入输出的数据流重导向(standard input/standard output), 以及管道命令(pipe)的方式,将待处理的文件一边打包一边解压缩到目标目录去。
将/etc目录一边打包一边在/tmp解开:

              [root@initroot ~]# cd /tmp
              [root@initroot tmp]# tar -cvf - /etc | tar -xvf -
            
上面的命令有点类似cp -r /etc /tmp!
要注意的是输出文件变成-,输入文件也变成-,分别表示standard output和standard input。|为管线符号!
可以将-简单的想成是在内存中的一个设备(缓冲区)。
我们想要将/etc下面的资料直接copy到/tmp目录下,但是又觉得使用 cp -r 有点麻烦,那么就直接以这个打包的方式来打包,命令里面的-就是表示那个被打包的文件啦! 由于我们不想要让中间文件存在,所以就以这一个方式来进行复制的行为!

11.系统备份示例

回到顶部

系统上有非常多的重要目录需要进行备份,不建议你将备份数据放置到/root目录下!
经常需要备份的目录有如下几个:
/etc/ (配置文件)
/home/ (用户的家目录)
/var/spool/mail/ (系统中,所有账号的邮件信箱)
/var/spool/cron/ (所有账号的工作排成配置文件)
/root (系统管理员的家目录)
假设将备份的数据放置到/backups目录下,该目录仅有root有权限!
此外,希望每次备份的文件名都不相同,例如使用:backup-system-20200701.tar.bz2之类的文件名。
1. 先处理要放置备份数据的目录与权限:

              [root@initroot ~]# mkdir /backups
              [root@initroot ~]# chmod 700 /backups
              [root@initroot ~]# ll -d /backups
              drwx------. 2 root root 6 Jul 1 17:25 /backups
            
2. 假设今天是2020/07/01,建立备份的方式如下:
              [root@initroot ~]# tar -jcv -f /backups/backup-system-20150701.tar.bz2 \
              > --exclude=/root/*.bz2 --exclude=/root/*.gz --exclude=/home/loop* \
              > /etc /home /var/spool/mail /var/spool/cron /root
              ...省略...
              [root@initroot ~]# ll -h /backups/
              -rw-r--r--. 1 root root 21M Jul 1 17:26 backup-system-20150701.tar.bz2
            

12.SELinux对解压缩的影响

回到顶部

SELinux是比较特别的细部权限设定机制,SELinux 的权限问题可能会让你的系统无法存取某些配置文件内容,导致影响到系统的正常使用权。
如果系统必须要以备份的数据来还原到原本的系统中,那么得要特别注意复原后的系统的SELinux问题! 尤其是系统文件,例如/etc目录下的文件。 通过tar去备份了/etc,然后尝试在另一部系统上面复原。 复原完毕之后,无法正常的登入系统! 使用单人维护模式去操作系统时看起来一切正常,但就是无法顺利登入。
其实这个问题倒是很常见!大部分原因就是因为/etc/shadow密码文件的SELinux类型在还原时被更改了!导致系统的登入程序无法顺利的存取它,才造成无法登入。
简单的处理方式有这几个:
通过各种可行的救援方式登入系统,然后修改/etc/selinux/config文件,将SELinux改成permissive模式,重新启动后系统就正常了;
在第一次复原系统后,不要立即重新启动!先使用restorecon -Rv /etc自动修复一下SELinux类型即可。
通过各种可行的方式登入系统,建立/.autorelabel文件,重新启动后系统会自动修复SELinux类型,并且又会再次重新启动,之后就正常了!
tar命令用于解压缩文件

linux gzip命令

回到顶部

gzip是应用最广泛的压缩命令了! gzip可以解开compress, zip与gzip等软件的压缩文件。 gzip压缩后的文件后缀名为*.gz!
gzip常用的命令格式如下:

            [peter@study ~]$ gzip [-cdtv#] filename
            #读取gzip压缩后的文本文件
            [peter@study ~]$ zcat/zmore/zless/zgrep filename.gz
            选项与参数:
            -c :将压缩的数据输出到屏幕上,可通过数据流重导向来处理;
            -d :将文件解压缩,类似gunzip命令;
            -t :检验压缩文件的一致性,查看文件有无错误;
            -v :显示原文件与压缩文件的压缩比等信息;
            -# :#代表数字,表示压缩等级,-1最快,但是压缩比最差、-9最慢,但是压缩比最好!默认为-6
          
将/etc/services文件复制到/tmp目录下, 然后用gzip压缩:
            [peter@study ~]$ cd /tmp
            [peter@study tmp]$ cp /etc/services .
            [peter@study tmp]$ gzip -v services
            services:	 61.4% -- replaced with services.gz
          
注意gzip默认用压缩后的.gz文件替换掉原文件。
.gz文件可以被windows下的WinRAR/7zip软件解压缩!
通过比较压缩前后文件的大小,可以看出压缩后的文件大小明显小了很多:
            [peter@study tmp]$ ls -l /etc/services /tmp/services.gz
            -rw-r--r-- 1 root  root  19183 Dec 26  2016 /etc/services
            -rw-r--r-- 1 peter peter  7441 Feb  9 21:47 /tmp/services.gz
          
由于services本身是文本文件,可以使用zcat、zmore、zless读取gzip压缩后的压缩文件:
            [peter@study tmp]$ zcat services.gz
          
屏幕上会显示servcies.gz解压缩之后的源文件内容!
将刚才压缩后的文件解压缩:
            [peter@study tmp]$ gzip -d services.gz
          
            [peter@study tmp]$ gunzip services.gz
          
gzip -d或者gunzip将压缩文件解压缩,并删除掉原来的压缩文件。
用最佳的压缩比压缩重新压缩services文件,并保留原文件:
            [peter@study tmp]$ gzip -9 -c services > services.gz
          
gzip提供1~9的压缩等级,一般使用默认的6就可以了!可以不加-9选项。
-c选项将原本要转成压缩文件的数据内容输出到屏幕, 可以通过重定向符号>将数据重定向输出到文件,这样就可以建立压缩文件。 文件名可以自己定义,尽量遵循gzip的压缩文件名要求!
针对.gz压缩文件,除了zcat、zmore、zless,还有一个和grep功能对应的zgrep命令。 例如从压缩文件services.gz中,找出含有http关键词的行?
            [peter@study tmp]$ zgrep -n 'http' services.gz
            7:# Updated from http://www.iana.org/assignments/port-numbers and other
            8:# sources like http://www.freebsd.org/cgi/cvsweb.cgi/src/etc/services .
            53:http		80/tcp		www		# WorldWideWeb HTTP
            138:https		443/tcp				# http protocol over TLS/SSL
            419:http-alt	8080/tcp	webcache	# WWW caching service
            420:http-alt	8080/udp
          
cat、more、less等命令可以使用不同的方式来读取纯文本文件, zcat、zmore、zless则分别对应cat、more、less,可以读取纯文本文件被压缩后的压缩文件! zgrep命令则对应grep命令,可以提取压缩文件中的关键字所在的行,相当于将压缩文件解压缩后使用grep命令。 gzip命令的目的就是用来取代compress命令,所以上面的zcat、zmore、zless和zgrep命令同样也可以读取compress压缩文件。
可以使用znew命令将老式的compress压缩文件转换为gzip格式压缩文件。

bzip2, bzcat/bzmore/bzless/bzgrep

回到顶部

gzip是为了取代compress并提供更好的压缩比,而bzip2则是为了取代gzip并提供更佳的压缩比。 bzip2的压缩比比gzip还要高,用法几乎与gzip相同:

            [peter@study ~]$ bzip2 [-cdkzv#] 文件名
            [peter@study ~]$ bzcat/bzmore/bzless/bzgrep filename.gz #读取gzip压缩后的文本文件文件名.bz2
            选项与参数:
            -c :将压缩的过程产生的数据输出到屏幕上!
            -d :解压缩的参数
            -k :保留源文件,而不会删除原始的文件喔!
            -z :压缩的参数(默认值,可以不加)
            -v :可以显示出原文件/压缩文件的压缩比等信息;
            -# :与gzip同样的,都是在计算压缩比的参数, -9最佳, -1最快!
          
将/etc/services文件复制到/tmp目录下, 然后用bzip2压缩:
            [peter@study tmp]$ bzip2 -v services
            services:
            5.409:1,
            1.479 bits/byte, 81.51% saved, 670293 in, 123932 out.
            [peter@study tmp]$ ls -l services*
            -rw-r--r--. 1 peter peter 123932 Jun 30 18:40 services.bz2
            -rw-rw-r--. 1 peter peter 135489 Jun 30 18:46 services.gz
          
services会变成services.bz2,压缩率由gzip的79%提升到bzip2的81%,bzip2的压缩比要较gzip好喔!
读取压缩后的文件services.bz2:
            [peter@study tmp]$ bzcat services.bz2
          
将压缩后的文件services.bz2解压缩:
            [peter@study tmp]$ bzip2 -d services.bz2
          
再次压缩services文件, 最佳的压缩比压缩,并保留原本的文件:
            [peter@study tmp]$ bzip2 -9 -c services > services.bz2
          
bzip2连选项与参数都跟gzip一模一样!只是压缩后的文件扩展名由.gz变成.bz2!
其他的用法都大同小异! bzip2的压缩率确实比gzip要好些!
不过对于大容量文件来说,bzip2压缩时间会比gzip更长!
有点拿时间换空间的感觉。

linux xz命令

回到顶部

bzip2已经具有很高的压缩比了,xz压缩比比bzip2还要高! xz的用法也和gzip、bzip2几乎一模一样:

            [peter@study ~]$ xz [-dtlkc#] 文件名
            [peter@study ~]$ xcat/xmore/xless/xgrep 文件名.xz
            选项与参数:
            -d :就是解压缩啊!
            -t :测试压缩文件的完整性,看有没有错误
            -l :列出压缩文件的相关信息
            -k :保留原本的文件不删除~
            -c :同样的,就是将数据由屏幕上输出的意思!
            -# :同样的,也有较佳的压缩比的意思!
          
将/etc/services文件复制到/tmp目录下,然后用xz命令压缩/tmp/services文件:
            [peter@study tmp]$ xz -v services
            services (1/1)
            100 %
            97.3 KiB / 654.6 KiB = 0.149
            [peter@study tmp]$ ls -l services*
            -rw-rw-r--. 1 peter peter 123932 Jun 30 19:09 services.bz2
            -rw-rw-r--. 1 peter peter 135489 Jun 30 18:46 services.gz
            -rw-r--r--. 1 peter peter 99608 Jun 30 18:40 services.xz
            
可以看到xz的压缩比比gzip和bzip2都要高。
列出压缩文件services.xz的信息:
            [peter@study tmp]$ xz -l services.xz
            Strms Blocks
            1 1
            Compressed Uncompressed
            97.3 KiB   654.6 KiB
            Ratio Check Filename
            0.149 CRC64 services.xz
            
xz -l列出了文件压缩前后的大小对比。
读取压缩文件:
            [peter@study tmp]$ xzcat services.xz
          
解压缩:
            [peter@study tmp]$ xz -d services.xz
          
重新压缩文件,保留原文件:
            [peter@study tmp]$ xz -k services
          
由于xz的压缩比非常高,所以xz花费的时间往往也比较久!
可以使用time命令统计gzip、bzip2、xz这三个压缩命令的时间:
            [peter@study tmp]$ time [gzip|bzip2|xz] -c services > services.[gz|bz2|xz]
          
结果发现这三个指令的运行时间依序是: 0.019s, 0.042s, 0.261s。
可以看到xz占用的时间比前两个多出很多。
所以三个命令的使用需要用户酌情选择。折中的方案就是使用bzip2了。

initroot编辑整理,转载请注明www.initroot.com