压缩出现的原因简析

    压缩为什么会诞生?我们可以想象一下如果没有压缩的场景:磁盘不够用了,再买一块扩展;一个游戏10G,下载下来得一整天,我们要上传一个1G电影得1天...买一块硬盘好贵啊,上传下载好耗费时间啊。如果我们可以将游戏压缩到原来的80%,我们就可以节省下来20%的磁盘空间,同时也节省了下载及上传的时耗。所以压缩诞生的目的首先是解决磁盘空间问题,其次也是为了节省我们上传下载的时耗问题。

    看起来它的出现真的是好的无以复加,不过它也有它的不足,压缩必定伴随着压缩这个过程,同样若是想要解压也需要解压这个过程,这个过程需要占用大量CPU的时间,我们应该会有这种感受,当我们压缩或解压缩大文件时,个人PC会很卡,因为当前的较多CPU资源都用于处理压缩或解压这个进程。

    所以压缩的出现是与现实的妥协与折中的产物,我们节省了磁盘空间,减少了上传下载时耗,但我们却会在解压或压缩时增加了CPU的负担。

                                                           实验环境为CentOS7.2



压缩及解压工具(包括归档工具tar及cpio)


下面我们就来了解下Linux中的压缩解压缩及归档工具

它主要有如下几种:

    compress/uncompress: .Z   很久之前使用的一款压缩与解压工具,现在几乎消失踪迹(本文不予介绍)

    gzip/gunzip: .gz    现在Linux系统中使用范围最广的压缩与解压工具

    bzip2/bunzip2: .bz2 在gzip之后出现,因其压缩比并没有明显提升,因此使用的并不太多

    xz/unxz: .xz        最近出现的压缩与解压工具,因其压缩比较之gzip有了明显的提高,因此近来其用人数越来越多,兴许它可以取代gzip的地位

    zip/unzip           这款压缩与解压工具的兼容性更好,它的平台很广,Unix,Windows,Linux,Mac等都可以使用。

    tar, cpio           此为归档工具,tar用的最广,cpio一般不用(这里不予介绍)


gzip/gunzip/zcat

  gzip、gunzip、zcat:compress or expand files

注:默认压缩后删除原文件

命令使用格式

gzip [OPTION]... FILE ...

常用选项

    -d: 解压缩,相当于gunzip

    -c: 将结果输出至标准输出;压缩后保留原文件

            其格式为:gzip -C FILE > /PATH/TO/SOMEFILE.gz

    -#:1-9,指定压缩比,数字越大压缩比越大;默认为6,通常不建议指定压缩比。


    zcat:不显式展开的前提下查看文本文件内容;

…………………………………………………………………………………………………………

命令演示

我们把/var/log/message文件拷贝到/test文件夹内

[root@localhost test]# ll -h
总用量 2.5M
-rw-------. 1 root root 2.5M 8月  19 16:33 messages
[root@localhost test]# gzip messages 
[root@localhost test]# ll -h
总用量 196K
-rw-------. 1 root root 194K 8月  19 16:33 messages.gz
[root@localhost test]# zcat messages.gz 
Aug 14 11:39:15 centos7 avahi-daemon[905]: Invalid response packet from host 10.1.252.
7.
Aug 14 11:39:16 centos7 avahi-daemon[905]: Invalid response packet from host 10.1.252.
7.
...
[root@localhost test]# gzip -d messages.gz 
[root@localhost test]# ll -h
总用量 2.5M
-rw-------. 1 root root 2.5M 8月  19 16:33 messages

上面演示了压缩,zcat,解压的过程,这个过程还说明了在压缩文件后会默认将原文件删除,并且解压后自动会为原文件加上.gz后缀,本来文件后缀对Linux没有意义,但是压缩是个例外

下面再演示下指定压缩比及压缩后保留原文件的操作。

[root@localhost test]# gzip -9 -c messages > /test/message1.gz 
[root@localhost test]# ll -h
总用量 2.7M
-rw-r--r--. 1 root root 188K 8月  19 16:52 message1.gz
-rw-------. 1 root root 2.5M 8月  19 16:33 messages

对比两个实验结果可以发现大的压缩比确实可以减少占的磁盘空间,但是默认的6与指定的9相差并不大,因此实际工作中一般不指定文件的压缩比


bzip2/bunzip2/bzcat


命令使用格式

    bzip2 [OPTION]... FILE ...

常用选项

     -k: keep, 保留原文件;其bzip -k FILE即可

    -d:解压缩,相当于bzip2

    -#:1-9,指定压缩比,数字越大压缩比越大;默认为6,通常不建议指定压缩比。

    bzcat:不显式展开的前提下查看文本文件内容;

…………………………………………………………………………………………………………

命令演示

[root@localhost test]# bzip2 messages   
[root@localhost test]# ll -h
总用量 316K
-rw-r--r--. 1 root root 188K 8月  19 16:52 message1.gz
-rw-------. 1 root root 128K 8月  19 16:33 messages.bz2

可以看出来bzip2确实比gzip的压缩比好。

[root@localhost test]# bzip2 -d messages.bz2 
[root@localhost test]# ll -h
总用量 2.7M
-rw-r--r--. 1 root root 188K 8月  19 16:52 message1.gz
-rw-------. 1 root root 2.5M 8月  19 16:33 messages
[root@localhost test]# bzip2 -k messages
[root@localhost test]# ll -h
总用量 2.8M
-rw-r--r--. 1 root root 188K 8月  19 16:52 message1.gz
-rw-------. 1 root root 2.5M 8月  19 16:33 messages
-rw-------. 1 root root 128K 8月  19 16:33 messages.bz2
[root@localhost test]# bzcat messages.bz2 | more
Aug 14 11:39:15 centos7 avahi-daemon[905]: Invalid response packet from host 10.1.252.
7.
Aug 14 11:39:16 centos7 avahi-daemon[905]: Invalid response packet from host 10.1.252.
7.
...

上面为bzip2的解压、留原文件的压缩与bzcat。


xz/unxz/xzcat


命令使用格式

xz [OPTION]... FILE ...

常用选项

    -k: keep, 保留原文件;表达格式为:xz -k FILE

    -d:解压缩,相当于unxz

    -#:1-9,指定压缩比,数字越大压缩比越大;默认为6,通常不建议指定压缩比。

     xzcat: 不显式展开的前提下查看文本文件内容;

…………………………………………………………………………………………………………

命令演示

[root@localhost test]# xz messages
[root@localhost test]# ll -h
总用量 408K
-rw-r--r--. 1 root root 188K 8月  19 16:52 message1.gz
-rw-------. 1 root root 128K 8月  19 16:33 messages.bz2
-rw-------. 1 root root  90K 8月  19 16:33 messages.xz

从上面三种压缩工具压缩相同的文件可以明显看到xz的压缩效果最好

[root@localhost test]# xz -d messages.xz 
[root@localhost test]# ll -h
总用量 2.8M
-rw-r--r--. 1 root root 188K 8月  19 16:52 message1.gz
-rw-------. 1 root root 2.5M 8月  19 16:33 messages
-rw-------. 1 root root 128K 8月  19 16:33 messages.bz2
[root@localhost test]# xz -k messages
[root@localhost test]# ll -h
总用量 2.9M
-rw-r--r--. 1 root root 188K 8月  19 16:52 message1.gz
-rw-------. 1 root root 2.5M 8月  19 16:33 messages
-rw-------. 1 root root 128K 8月  19 16:33 messages.bz2
-rw-------. 1 root root  90K 8月  19 16:33 messages.xz
[root@localhost test]# xzcat messages.xz | more
Aug 14 11:39:15 centos7 avahi-daemon[905]: Invalid response packet from host 10.1.252.
7.
...



tar  Linux中最常用的归档工具


命令使用格式:

tar [OPTION]... 

(1) 创建归档

    tar -c -f /PATH/TO/SOMEFILE.tar FILE...

    tar -cf /PATH/TO/SOMEFILE.tar FILE...


(2) 查看归档文件中的文件列表

    tar -t -f /PATH/TO/SOMEFILE.tar


(3) 展开归档

    tar -x -f /PATH/TO/SOMEFILE.tar

    tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH/TO/DIR


4)结合压缩工具实现:归档并压缩

    -j: bzip2,

    -jcf 使用bzip2对目标文件夹进行归档并以bzip2格式压缩

    -jxf 使用bzip2对.bx2后缀的tar包进行解压并展开归档

    -z: gzip,

    -zcf使用gzip对目标文件夹进行归档并以gzip格式压缩

    -zxf使用gzip对.gz后缀的tar包进行解压并展开归档

    -J: xz

    -Jcf使用xz对目标文件夹进行归档并以xz格式压缩

    -Jxf使用xz对.xz后缀的tar包进行解压并展开归档

…………………………………………………………………………………………………………

命令演示

[root@localhost test]# cp /var/log/messages* ./
[root@localhost test]# ll -h
总用量 16M
-rw-r--r--. 1 root root 188K 8月  19 16:52 message1.gz
-rw-------. 1 root root 2.5M 8月  19 17:14 messages
-rw-------. 1 root root 1.1M 8月  19 17:14 messages-20160724
-rw-------. 1 root root 1.4M 8月  19 17:14 messages-20160731
-rw-------. 1 root root 4.4M 8月  19 17:14 messages-20160807
-rw-------. 1 root root 6.1M 8月  19 17:14 messages-20160814
-rw-------. 1 root root 128K 8月  19 16:33 messages.bz2
-rw-------. 1 root root  90K 8月  19 16:33 messages.xz
[root@localhost test]# mkdir test
[root@localhost test]# mv message* test/
[root@localhost test]# ll
总用量 4
drwxr-xr-x. 2 root root 4096 8月  19 17:14 test

先从/var/log/message文件夹下拷贝一些文件,之后在原路径下创建一新文件夹再将这些文件转移其中

下面开始归档操作

[root@localhost test]# tar -cf /test/message1.tar test/
[root@localhost test]# ll -h
总用量 16M
-rw-r--r--. 1 root root  16M 8月  19 17:16 message1.tar
drwxr-xr-x. 2 root root 4.0K 8月  19 17:14 test

归档后总大小并没有减小,通常反而会大一点,所以一般在归档后进行压缩。

[root@localhost test]# tar -t -f /test/message1.tar 
test/
test/message1.gz
test/messages
test/messages-20160724
test/messages-20160731
test/messages-20160807
test/messages-20160814
test/messages.bz2
test/messages.xz
[root@localhost test]# xz message1.tar 
[root@localhost test]# ll -h
总用量 896K
-rw-r--r--. 1 root root 890K 8月  19 17:16 message1.tar.xz
drwxr-xr-x. 2 root root 4.0K 8月  19 17:14 test

这里16M文件被xz工具压缩至890K。

[root@localhost test]# rm -rf test/
[root@localhost test]# ll
总用量 892
-rw-r--r--. 1 root root 910960 8月  19 17:16 message1.tar.xz
[root@localhost test]# tar -xf message1.tar.xz 
[root@localhost test]# ll -h
总用量 896K
-rw-r--r--. 1 root root 890K 8月  19 17:16 message1.tar.xz
drwxr-xr-x. 2 root root 4.0K 8月  19 17:14 test

这里使用tar -xf为什么不加前缀J?因为tar在展开归档时会自动检测指定要展开的压缩包,命令会根据后缀自动选择相应的工具进行解压。




本文总结


1、文件的后缀原本对Linux系统无实际意义,但在压缩解压是个例外

2、gzip、bzip2、xz都只支持压缩文件无法压缩目录,若要对目录进行压缩则需先进行归档之后对归档的文件进行压缩。

3、tar只能对文件归档不能压缩解压操作不过它可以调用gzip、bzip2、xz实现归档压缩及解压并展开归档。

4、tar仅仅做归档操作,其产生的tar包大于等于原来的文件夹大小。

5、tar展开压缩归档文件无需事先指明要解压扩展的文件的压缩工具,因为其可以自动识别。

6、压缩及解压缩是以牺牲CPU时间为代价节省磁盘空间及传输文件时间,若是压缩解压10MB以上的文件,可以明显感觉到命令执行时间变长。