压缩出现的原因简析
压缩为什么会诞生?我们可以想象一下如果没有压缩的场景:磁盘不够用了,再买一块扩展;一个游戏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以上的文件,可以明显感觉到命令执行时间变长。