# 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
1
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
1
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
1
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
1
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

1
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
1
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
1
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