背景
一个完整的软件,需要有许多不同类型的文件构成:库文件、配置文件、可执行文件等;一个源代码,需要有许多不同的模块代码构成:数据模块、控制模块、视图模块等。少则几十,多则上百。这么多的文件,需要传输的时候怎么弄呢?Linux中就有了打包工具就是把所有的文件打包成一个文件。那么这么大的文件传输是不是很慢呢?Linux中也有压缩的工具;下面一一介绍。
压缩解压缩工具
压缩工具
gzip:压缩后文件扩展名为.gz,压缩后会删除原文件。
1 2 3 |
$ gzip [OPTIONS] /PATH/TO/FILENAME -# #指定压缩比0-9;默认是6; -d #解压缩; |
bzip2:压缩后文件扩展名为.bz2,默认压缩后删除原文件,比gzip有更大压缩比。
1 2 3 4 |
$ bzip2 [OPTIONS] /PATH/TO/FILENAME -# #指定压缩比,0-9,默认6; -d #解压缩; -k #保留原文件; |
xz:压缩后文件扩展名为.xz,压缩后删除原文件,比gzip和bizp2压缩比都高。
1 2 3 4 |
$ xz [OPTIONS] /PTAH/TO/FILENAME: -# #指定压缩比,0-9,默认6; -d #解压缩; -k #保留原文件; |
zip:压缩后文件扩展名为.zip,支持对目录压缩。
1 2 |
$ zip [OPTIONS] /PTAH/TO/FILENAME: -r #递归压缩目录所有文件; |
解压缩工具
gunzip:解压.gz的文件(gzip压缩文件)。
bungzip2:解压.bz2的文件(bzip2压缩文件)。
unxz:解压.xz的文件(xz压缩文件)。
unzip:解压.zip的文件(zip压缩文件)。
查看压缩文件
zcat file.gz:临时查看.gz压缩文件,不需要解压。
bzcat file.bz2:临时查看.bz2压缩文件,不需要解压。
xzcat file.xz:临时查看.xz压缩文件,不需要解压。
压缩原理
通过上面的实例我们发现,压缩顾名思义就是把大的文件通过某种方法使其变得小点;那么这个过程是怎么样的呢?我们通常发现将一个原本为5MB的文件压缩后可以变成1MB,其压缩率是20%。注意,通常情况下,压缩必须是无损的。换句话说,必须保证压缩/解压过程中恢复的数据与原始数据完全相同。不然就会发生数据损坏。
首先,我们知道,不管是什么文件,它的数据都是大量的二进制比特,它们是以字节为单位存放。至于这写二进制数据代表什么含义,取决于其生产者和使用者之间的协议。其次,在很多时候,这些二进制数据可以用另一种更简短的形式来表示。这个时候,称这些数据是可压缩的。比如,一个最容易理解的例子是形成编码。形成编码的思想是观察被压缩的数据,看它是否带有重复的内容。加入我们要压缩这样一串数据:
AAAAAFFRRRU
那么,因为我们发现有些字母是连续重复出现的,所以,这串数据可以简单地表示成:5A2F3R1U
注意,计算机只接受二进制比特,所以“AAAAAFFRRRU”在存储器和磁盘中其实是这样的:01000001 01000001 01000001 01000001 01000001 01000110 01000110 01010010 01010010 01010010 01010101
按照上面所讲的形成编码方法,压缩之后的结果是这样的:00000101 01000001 00000010 01000110 00000011 01010010 00000001 01010101
可以看出,压缩之后显然节省了若干字节。如果一个软件指导这个文件是用形成编码压缩的,它就应该懂得如何恢复原来的内容。
当然,并不是所有文件都可以被压缩,尤其是不存在重复内容的时候,压缩之后反而会增加数据量。不过行程编码的方法对于压缩图像文件特别有效,因为图像是由像素组成的,而像素则是一些表示颜色和二进制数据。最关键的是,图像中包含大量具有相同颜色的像素。
行程编码不是唯一的文件压缩方法。但是,不管有多少种方法,基本的思想没有改变,那就是为被压缩的内容找到一种更简短、更节省空间的表示方法。我们通常也叫着算法
归档工具
tar:Linux下一款常用的归档工具,通过上面我们发现gzip,bzip2、xz都只能对文件压缩,而tar工具就是把一个目录打包成一个文件继而配合压缩工具对归档后的文件进行压缩。
1 2 3 4 5 6 7 8 9 10 11 |
$ tar [OPTIONS] FILE.tar /dir -c #创建归档文件; -f #指定归档文件并指定新名称; -v #显示归档过程; -x #展开归档文件; --xattrs #归档时保留文件的扩展属性信息; -tf #不展开归档直接查看归档了哪些文件; -zvcf #z表示调用gzip创建归档压缩文件; -jvcf #j表示调用bzip2创建归档压缩文件; -Jvcf #J表示调用xz创建归档压缩文件; -xvf #展开归档压缩的文件(可以选择z,j,J进行解压各种格式的打包压缩包,也可以不加系统会自动查找并解压); |
实例
原目录大小
1 2 |
$ du -sh /tmp/hadoop 2.3G hadoop |
1. 使用gzip对/tmp/Hadoop进行归档压缩,产生hadoop.tar.gz文件
1 2 3 4 5 6 7 8 9 |
# 压缩耗时; $ time tar -zvcf hadoop.tar.gz /tmp/hadoop real 0m49.935s user 0m46.205s sys 0m3.449s # 压缩大小; $ du -sh hadoop.tar.gz 410M hadoop.tar.gz |
2. 使用bzip2对/tmp/Hadoop进行归档压缩,产生hadoop.tar.bz2文件
1 2 3 4 5 6 7 8 9 |
# 压缩耗时; $ time tar -jvcf hadoop.tar.bz2 /tmp/hadoop real 5m6.005s user 5m5.182s sys 0m5.890s # 压缩大小; $ du -sh hadoop.tar.bz2 297M hadoop.tar.bz2 |
3. 使用xz对/tmp/Hadoop进行归档压缩,产生hadoop.tar.xz文件
1 2 3 4 5 6 7 8 9 |
# 压缩耗时; $ time tar -Jvcf hadoop.tar.xz /tmp/hadoop real 12m31.899s user 12m31.426s sys 0m7.854s # 压缩大小; $ du -sh hadoop.tar.xz 205M hadoop.tar.xz |
压缩比高占CPU就高,从而压缩时间线就长。从结果来看,我想大家应该都更倾向使用gzip来压缩归档,压缩比相比bzip2和xz低的也不算太多,但是时间上比它俩可少太多了。另外还有大神写了一个多线程的gzip压缩工具,那个速度真是杠杠的,可以看:多线程压缩工具Pigz使用
相对解压就比较简单点了,直接给个xvf参数就可以了,它可以自动识别压缩格式。
1 |
$ tar xvf hadoop.tar.gz -C /tmp |
-c是用来指定解压到哪个目录下的。
cpio:是Linux下比较早的归档工具,/boot/initrd-2.6.18-308.e15.img就是使用cpio归档的。