压缩:需要用最小的空间,来存储更多的数据。空间包括:内存,磁盘,网络传输带宽。
压缩的基本原理是,通过查找文件中的重复字节,对重复的字节建立一个词典文件,并用一个代码表示重复的字节。比如一个文档中,出现了较多重复的字符【Hello world】,会重新创建一个词典文件,将重复的字符【Hello world】用一个代码来表示。这样就可以达到压缩文档体积的效果。
压缩技术分为:无损压缩和有损压缩。顾名思义,有损压缩和无损压缩,分别是指文件在压缩过程中有无丢失信息。有损压缩,主要是指丢失个别数据,对文件也不会造成很大影响,比如广泛应用的视频、音频、图像文件中。

需要注意的是,并不是压缩次数越多越好,也就是说,如果对压缩的文件再次进行压缩,不会减少空间的利用,反而会加大空间的利用。因为压缩的过程中,需要增加一些对压缩信息的描述,这些信息也会占据一定的空间;经过压缩后的文件,已没有太多冗余信息,再次压缩,只会增加新的压缩信息,适得其反。

压缩和解压常用到的命令:

序号 命令 解释
1 tar 同时支持:1)打包和解包;2)压缩和解压
支持的文件格式有:.tar.gz, .tar.bz2
2 zip
3 unzip
4 gzip
5 gunzip
6 bzip2 压缩以.bz2格式的文件
7 bunzip2

1. 打包和归档tar

在说明压缩和解压之前,先讲另外一个概念:打包(也叫归档)。
为什么需要打包,是因为在linux中,只支持对一个文件进行压缩,如果有多个文件,需要将多个文件进行打包,生成一个打包的.tar文件,在对这个.tar文件进行压缩和解压。

打包是指把许多个文件,打包成一个大包裹。打包并没有压缩,也就是说,打包只是把文件集合在一起,并没有压缩文件。最常用的打包命令是tar,将多个文件打包成.tar文件。
image.png
tar命令的选项:

选项 解释
c 将多个文件或目录进行打包
v 显示打包文件过程
f 指定包的文件名
x 对tar包做解打包操作
C(大写) 指定解包的位置,默认是在当前目录下

一般选项组合如下:

  • 打包:-cvf,将多个文件或目录打包成.tar包
  • 解打包:-xvf

使用如下:

  1. tar -cvf test.tar test.txt # 将test.txt打包成test.tar
  2. tar -cvf test.tar test1.txt test2.txt test3.txt # 将test1.txt、test2.txt、test3.txt都打包成test.tar包
  3. tar -cvf test/test.tar test?.txt # 将符合正则表达式的test?.txt均打包成test.tar包,test.tar在test目录下
  4. tar -xvf test.tar # 将test.tar解包
  5. tar -xvf test/test.tar -C newdir # 将test/test.tar中的包,解压到newdir目录中

2. 压缩和解压tar

压缩,会将当个文件或.tar文件,压缩成.tar.gz, .tar.bz2;最常用的压缩命令有:tar、zip、gzip、bzip2.
解压,会将压缩文件,解压成原来的文件;最常用的解压命令是:unzip、gunzip、bunzip2.

可以通过tar命令,将文件压缩成.tar.gz,.tar.bz2,也能对.tar.gz,.tar.bz2的压缩包进行解压。
tar命令常用的选项:

选项 解释
c 压缩
v 压缩或解压文件的过程
f 压缩和解压的文件
x 解压
C(大写) 压缩和解压的文件位置
z 文件为.tar.gz或.tar.bz2的压缩或解压

选项比较多,一般比较常用的,有下面几个组合:

选项组合 使用场景
-cvf 压缩,多用于单个文件的压缩
-zcvf 压缩,多用于.tar文件的压缩,可压缩成.tar.gz, .tar.bz2
-zxvf 解压,多用于.tar.gz, .tar.bz2的解压

使用如下:

  1. tar -cvf test.tar.gz test.txt
  2. tar -zxvf test.tar.gz

3. zip和unzip

  1. zip -r test.zip ./* # 将本地文件全部压缩到test.zip中
  2. unzip -o -d test/ test.zip # 将压缩文件test.zip解压到test目录下,-o表示覆盖,-d表示解压的目录

4. gzip和gunzip

命令使用方式:gzip 文件
使用命令【gzip test.txt】文件后,会直接修改原文件test.txt为test.txt.gz

  1. gzip test.txt # 直接将test.txt压缩成test.txt.gz
  2. gunzip test.txt.gz # 直接将test.txt.gz解压成test.txt
  3. gzip -c test.txt # 将压缩的文件test.txt发送到标准输出,并不会生成压缩文件
  4. gunzip -c test.txt.gz # 将解压的文件发送到标准输出,并不会生成解压文件
  5. gzip -c test.txt > test.txt.zip
  6. gunzip -c test.txt.zip > test.txt

5. bzip2和bunzip2

bzip2和bunzip2的用法与gzip和gunzip的用法比较相似。

  1. bzip2 test.txt # 将test.txt压缩成test.txt.bz,直接将原来的文件压缩
  2. bzip test1.txt test2.txt test3.txt # 将test1.txt, test2.txt, test3.txt分别压缩成test1.txt.bz, test2.txt.bz, test3.txt.bz压缩包,直接将原来的文件压缩
  3. bunzip2 test.txt.bz
  4. bunzip2 test1.txt.bz test2.txt.bz test3.txt.bz
  5. bzip2 -k test.txt # 压缩test.txt,保留test.txt,生成新的压缩包test.txt.bz
  6. bunzip2 -k test.txt.bz # 解压test.txt.bz,保留test.txt.bz,生成新的test.txt