# Linux 系统常用的压缩指令
在 linux 环境中,压缩文件的扩展名大多是:.tar、.tar.gz、.tgz、.Z、.bz2、.xz ,为什么会有这么多?
虽然在 linux 下扩展名没有啥作用,但是支持的压缩指令非常多,彼此之间无法互通压缩或解压缩,扩展名用于分别是使用哪种软件来解压缩。常用的扩展名如下:
- .Z:compress 程序压缩的文件
- .zip:zip 程序压缩的文件
- .gz:gzip 程序压缩的文件
- .bz2:bzip2 程序压缩的文件
- .xz:xz 程序压缩的文件
- .tar:tar 程序打包的数据,并没有压缩过
- .tar.gz:tar 程序打包的数据,并经过 gzip 的压缩
- .tar.bz2:同上,经过了 bzip2 压缩
- .tar.xz:同上,经过了 xz 的压缩
linux 上常见的压缩指令是 gzip、bzip2 以及最新的 xz,还有支持 windows 的 zip,至于其他的压缩指令基本上都淘汰了。这些指令通常仅能针对一个文件来压缩与解压缩,如此一来每次压缩与解压缩都要一大堆文件,所以 tar (打包)软件就出现了
tar 可以将很多文件「打包」成为一个文件,将很多文件集结为一个文件,但是没有提供压缩的功能,后来 GNU 计划中,将整个 tar 与压缩的功能结合在一起,提供了更强大的压缩与打包功能。
# gzip、zcat/zmore/zless/zgrep
gzip 可以说是应用最广的压缩指令,目前可用解开 compress、zip 与 gzip 等软件所压缩的文件,语法如下
gzip [-cdtv#] 文档名
zcat 文档名.gz
2
选项与参数:
- c:将压缩的数据输出到屏幕上,可通过数据流重导向来处理
- d:解压缩的参数
- t:可以用来检验一个压缩文件的一致性,看看文件有无错误
- v:可以显示出原文件、压缩文件的压缩比等信息
#
:为数字的意思,代表压缩等级- -1:最快,但是压缩比最差
- -9:最慢,但是压缩比最好
- -6:默认值
实践练习
# 找出 /etc 下(不含子目录)容量最大的文件,并将他们复制到 /tmp,然后以 gzip 压缩
# S 排序时按文件 size,r 翻转,倒序;对于参数,笔者这里使用 man ls 查看的参数说明,记不住的时候就可以这样做
# ls -ldSr /etc/* 最大的排在最后,莫非使用了 S 就是降序排列的吗?
[mrcode@study ~]$ ls -ldS /etc/*
-rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services
-rw-r--r--. 1 root root 104251 Oct 4 18:28 /etc/ld.so.cache
[mrcode@study ~]$ cd /tmp/
[mrcode@study tmp]$ cp /etc/services .
[mrcode@study tmp]$ gzip -v services
services: 79.7% -- replaced with services.gz
[mrcode@study tmp]$ ll /etc/services /tmp/services*
-rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services
-rw-r--r--. 1 mrcode mrcode 136088 Oct 28 22:39 /tmp/services.gz
# 可以看到压缩比为 79.7,压缩之后变成了 130 多 k
2
3
4
5
6
7
8
9
10
11
12
13
14
15
这里需要注意,使用 gzip 进行压缩时,默认状态下原本的文件会被压缩成 .gz 的文件,并且原始文件不存在了(文案已经提示了);另外 gzip 压缩的文件在 windows 中可以被 WinRAR、7zip 软件解压缩
# 由于 services 是文件内容,将压缩后的文件内容读出来
zcat services.gz
# 该文件过大,直接读完,我们看不到最前面的内容了
# 可以使用 zmore、zless 去读取
# 将 services.gz 加压缩
# 这里使用 -d 来解压缩,还有一个 gunzip 指令也可以解压缩,但是有点难记住它
[mrcode@study tmp]$ gzip -d services.gz
[mrcode@study tmp]$ ll -l services*
# 同样,默认会将 .gz 的删除,剩下原来的文件名
-rw-r--r--. 1 mrcode mrcode 670293 Oct 28 22:39 services
# 将上面解开的文件,使用最佳压缩比压缩,并保留原文件
# 这个例子就明白 -c 使用数据流重导来处理是啥意思了,压缩输出到指定文件中
# 这里的 > 后续再 bash 章节会详细讲解
[mrcode@study tmp]$ gzip -9 -c services > services.gz
[mrcode@study tmp]$ ll -l services*
-rw-r--r--. 1 mrcode mrcode 670293 Oct 28 22:39 services
-rw-rw-r--. 1 mrcode mrcode 135489 Oct 28 22:50 services.gz
# 还可以在 services.gz 找那个找出 http 关键词在哪里(关键词搜索)
[mrcode@study tmp]$ zgrep -n 'http' services.gz
# 下面会输出好多包含 http 的信息
14:# http://www.iana.org/assignments/port-numbers
89:http 80/tcp www www-http # WorldWideWeb HTTP
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
在压缩文档中搜索字符的话可以使用 zgrep、egrep 等指令
# bzip2、bzcat/bzmore/bzgrep
bzip2 可以说是取代了 gzip 并提供更佳的压缩比。使用方式几乎与 gzip 相同
bzip2 [-cdkzv#] 文档名
bzcat 文档名.bz2
2
选项与参数:
- c:将压缩的过程产生的数据输出到屏幕上
- d:解压缩的参数
- k:保留源文件
- z:压缩的参数(默认值,可以不加)
- v:可以显示出源文件/压缩文件的压缩比信息
#
:与 gzip 一样,-9 最佳、-1 最快
实践练习
[mrcode@study tmp]$ bzip2 -v services
services: 5.409:1, 1.479 bits/byte, 81.51% saved, 670293 in, 123932 out.
[mrcode@study tmp]$ ll -l services*
-rw-r--r--. 1 mrcode mrcode 123932 Oct 28 22:39 services.bz2
-rw-rw-r--. 1 mrcode mrcode 135489 Oct 28 22:50 services.gz
# bz2 的压缩率比 gz 的压缩率还要好,看文件大小
# 读取 bz2 文件内容
bzcat services.bz2
# 解压,默认都是会删除掉原文件,包括压缩也是
[mrcode@study tmp]$ bzip2 -d services.bz2
[mrcode@study tmp]$ ls -l services*
-rw-r--r--. 1 mrcode mrcode 670293 Oct 28 22:39 services
-rw-rw-r--. 1 mrcode mrcode 135489 Oct 28 22:50 services.gz
# 这里使用 -k 参数来保留源文件,并使用最优压缩比
# 还可以使用 -c 来输出 bzip2 -9 -c services > services.gz
[mrcode@study tmp]$ bzip2 -9 -k services
[mrcode@study tmp]$ ls -l services*
-rw-r--r--. 1 mrcode mrcode 670293 Oct 28 22:39 services
-rw-r--r--. 1 mrcode mrcode 123932 Oct 28 22:39 services.bz2
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
使用方式 bzip2 与 gzip 几乎一模一样,不过压缩率好的一般都会更耗时
# xz、xzcat/xzmore/xzless/xzgrep
xz 比 bzip2 压缩比更高,用法也与 bzip2、gzip 就一模一样
xz [-dtlkc#] 文档名
xcat 文档名.xz
2
选项与参数:
- d:解压缩
- t:测试压缩文件的完整性,看是否有错误
- l:列出压缩文件的相关信息
- k:保留原本的文件
- c:将数据由屏幕上输出
#
:同样,压缩比数值
# 压缩
[mrcode@study tmp]$ xz -v services
services (1/1)
100 % 97.3 KiB / 654.6 KiB = 0.149
[mrcode@study tmp]$ ls -l services*
-rw-r--r--. 1 mrcode mrcode 123932 Oct 28 22:39 services.bz2
-rw-rw-r--. 1 mrcode mrcode 135489 Oct 28 22:50 services.gz
-rw-r--r--. 1 mrcode mrcode 99608 Oct 28 22:39 services.xz
# 看看上面的压缩,果真 xz 压缩比是最好的
# 列出压缩文件信息
[mrcode@study tmp]$ xz -l services.xz
Strms Blocks Compressed Uncompressed Ratio Check Filename
1 1 97.3 KiB 654.6 KiB 0.149 CRC64 services.xz
# 读取压缩文件内容
xzless services.xz 、xzcat services.xz 都可以
# 解压缩
[mrcode@study tmp]$ xz -d services.xz
# 使用 -k 压缩并保留源文件
[mrcode@study tmp]$ xz -k services
# 可以使用 time 指令统计他们的时间
# time [gzip|bzip2|xz] -c services > services.[gz|bz2|xz]
# 上面的语法,下面是实际的指令
[mrcode@study tmp]$ time gzip -c services > services.gz;\
> time bzip2 -c services > services.bz2;\
> time xz -c services > services.xz ;
real 0m0.023s # 看这个汇总时间
user 0m0.021s
sys 0m0.002s
real 0m0.043s
user 0m0.036s
sys 0m0.007s
real 0m0.232s # 看这个汇总时间
user 0m0.227s
sys 0m0.005s
一个 0.023s 一个 0.232s,相差 10 倍
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
← 压缩文件的用途与技术 打包指令:tar →