在现代计算机体系中,任何操作都是建立在对数据的处理上,所以存储是一个十分重要的组成部分。但是不管技术发展成什么样,存储总是会有上限,尤其是对于我们这些普通用户来说,我们是不可能在每一次缺少存储空间的时候就进行扩容。
随着计算机系统的发展,人们开发出了压缩这个东西。那么压缩是什么呢?简单来说,就是对一些有规律的数据进行规律化处理,来使其占用的空间变少。比如有一个文本文件,其内部内容是十个字母“a”,十个字母“b”,十个字母“c”,然后又是十个字母“a”...,就这样重复了100遍,那么此时的文本文件的长度就是“(10+10+10)*100=3000”个字符,此时,如果我们使用最简单的压缩算法,使用一个变量“x”来代替10个“a”,使用变量“y”来代替10个“b”,使用变量“z”来代替10个“c”,在写入文本的时候就可以这么写:先写x、y、z分别代表的含义,然后再重复x、y、z这三个变量100遍,此时就能够生成一个大小为“10+10+10+3*100=330”个字符的文件,当然这个大小是一个近似值。此时我们可以看到相对于原先的“3000”个字符,现在的“330”个字符缩小了近10倍。这就叫压缩过程,产生的文件叫做压缩文件,原先的文件叫做源文件,源文件和压缩文件的大小的比值叫做压缩比。
在这里我举的例子只是一个最简单的压缩过程,而且这个情况也很少出现,但是不管什么文件都能够找出类似的这种规律,所以相对来说纯文本文件的压缩比较大,而像视频和图像这种规律很难找的文件压缩比较小。要实现对文件的压缩,仅仅靠知道原理是远远不够的,所以这就需要用到别人已经写好的算法来实现压缩这个功能。在Linux系统中几种能够实现压缩功能的工具如下所示:
压缩工具:compress,相对的解压缩工具:uncompress,压缩后产生的文件的扩展名后缀:.Z
压缩工具:gzip,相对的解压缩工具:gunzip,压缩后产生的文件的扩展名后缀:.gz
压缩工具:bzip2,相对的解压缩工具:bunzip2,压缩后产生的文件的扩展名后缀:.bz2
压缩工具:xz,相对的解压缩工具:unxz,压缩后产生的文件的扩展名后缀:.xz
压缩工具:zip,相对的解压缩工具:unzip,压缩后产生的文件的扩展名后缀:.zip
其中压缩工具:xz是目前压缩比最高的工具
下面对以上提到的压缩工具进行详细的讲解:
在往下看之前,我们可以通过“dd”命令来创建一个大小为“30M”的文本文件:
1
2
3
4
5
6
7
8
|
[root@localhost
gzip
]
# dd if=/dev/zero of=test bs=30M count=1
记录了1+0 的读入
记录了1+0 的写出
31457280字节(31 MB)已复制,0.0490481 秒,641 MB/秒
[root@localhost
gzip
]
# ls -hl
总用量 30M
-rw-r--r--. 1 root root 30M 6月 7 16:45
test
[root@localhost
gzip
]
#
|
然后使用cp命令做出三个相同内容,不同名称的文件:
1
2
3
4
5
6
|
[root@localhost 20170607yasuo]
# ls -hl
总用量 90M
-rw-r--r--. 1 root root 30M 6月 7 16:52 testbzip
-rw-r--r--. 1 root root 30M 6月 7 16:51 testgzip
-rw-r--r--. 1 root root 30M 6月 7 16:52 testxz
[root@localhost 20170607yasuo]
#
|
有了这三个文件,就可以分别使用以下命令进行压缩(compress是一个相当古老的 unix 档案压缩指令,所以这里不再介绍):
gzip:
gzip, gunzip, zcat - compress or expand files
常用选项:
-d:解压缩(同gunzip)
-#:以指定的压缩比进行压缩,1-9,9为最高级;默认6
-c:将压缩结果输出到标准输出,不会对原文件进行压缩;
gzip -c /PATH/TO/FILE > /PATH/TO/COMPRESS_FILE.gz
举例:
1
2
3
4
5
6
7
|
[root@localhost 20170607yasuo]
# gzip testgzip
[root@localhost 20170607yasuo]
# ls -hl
总用量 61M
-rw-r--r--. 1 root root 30M 6月 7 16:52 testbzip
-rw-r--r--. 1 root root 30K 6月 7 16:51 testgzip.gz
-rw-r--r--. 1 root root 30M 6月 7 16:52 testxz
[root@localhost 20170607yasuo]
#
|
在这个例子中,我们可以看到原来的“testgzip”文件占用30M的大小,现在只占30K的大小
注意:在进行压缩的时候,如果不对命令进行特殊的指定,则会删除源文件,如果想留下源文件则需要使用“-c”选项
bzip2:
bzip2, bunzip2 - a block-sorting file compressor, v1.0.4
bzcat - decompresses files to stdout
常用选项:
-d:解压缩(同bunzip2)
-#:指定压缩比进行压缩,1-9,默认为6
-k:保留原文件不删除,创建新的压缩文件;
举例:
1
2
3
4
5
6
7
|
[root@localhost 20170607yasuo]
# bzip2 testbzip
[root@localhost 20170607yasuo]
# ls -hl
总用量 31M
-rw-r--r--. 1 root root 50 6月 7 16:52 testbzip.bz2
-rw-r--r--. 1 root root 30K 6月 7 16:51 testgzip.gz
-rw-r--r--. 1 root root 30M 6月 7 16:52 testxz
[root@localhost 20170607yasuo]
#
|
xz:
xz, unxz, xzcat - Compress or decompress .xz files
常用选项:
-d:解压缩(同unxz)
-#:指定压缩比进行压缩,1-9,默认为6
-k:保留原文件不删除,创建新的压缩文件;
举例:
1
2
3
4
5
6
7
|
[root@localhost 20170607yasuo]
# xz testxz
[root@localhost 20170607yasuo]
# ls -hl
总用量 44K
-rw-r--r--. 1 root root 50 6月 7 16:52 testbzip.bz2
-rw-r--r--. 1 root root 30K 6月 7 16:51 testgzip.gz
-rw-r--r--. 1 root root 4.7K 6月 7 16:52 testxz.xz
[root@localhost 20170607yasuo]
#
|
比较上面的三种压缩后的文件大小,可以发现“xz”这个命令的压缩比最大,但是消耗时间也最长,所以在日常使用中,我们要根据自己的需要来选择适合的压缩命令