压缩与解压

“小王,把我们郊游的照片压缩一下,发给我”,压缩文件在使用电脑时经常见到。将文件压缩不只是为了节省硬盘空间,同时也可以节省网络传输时间、归档文件方便管理等。

压缩可分为无损压缩与有损压缩两种,但不管是采用何种技术模型,其本质内容都是一样的,即通过某种特殊的编码方式将数据信息中存在的重复度、冗余度有效地降低,从而达到数据压缩的目的。例如二进制代码压缩,有 000000,可以把它变成 6 个 0 的写法 60,来减少该文件的空间。解压就是将压缩包中的文件恢复成没有压缩前的样子。

注解

有损压缩

在压缩时去除“不必要”的信息,对文件进行剪裁以使它变得更小,这种压缩方法称为有损压缩。在压缩后将无法复原成原始文件的样子。因此,如果需要完全重现原来的内容(例如软件应用程序、数据库和源代码),应该使用无损压缩。

有损压缩广泛应用于动画、声音和图像文件中,典型的代表就是影碟文件格式 mpeg、音乐文件格式 mp3 和图像文件格式 jpg。

在 Linux 中很多压缩程序只能针对一个文件进行压缩,当要压缩一大堆文件时,首先得先将一堆文件打成一个包(tar 命令),然后再用压缩程序进行压缩(gzip、bzip2 命令),就是说压缩会分为两步,先打包再压缩,各干个的事。

打包

tar 命令可以将多个文件和目录创建一个档案(归档),tar 最初是用来在磁带上创建档案;tar 命令也可以修改档案中的文件,或者加入新的文件;使用 tar 程序打出来的包我们常称为 tar 包,tar 包通常以 .tar 结尾。

提示

归档的一般用途:

  • 把一大堆的文件和目录打包成一个 tar 包,便于网络传输。
  • 生成tar包后,再用其它的程序进行压缩。

推荐阅读: tar 归档命令

压缩

gzip

gzip 是 GNUzip 的缩写,它是一个 GNU 自由软件的文件压缩程序,文件经它压缩过后以 .gz 为扩展名,据统计,gzip 命令对文本文件有 60%~70% 的压缩率。gzip 不能用来压缩目录,需要先归档目录,然后在压缩。gzip 和 tar 一起构成了 Linux 操作系统中流行的文件压缩格式(.tar.gz)。

gunzip 命令用来解压缩 gz 文件,事实上 gunzip 就是 gzip 的硬连接,因此不论是压缩或解压缩,都可以通过 gzip 命令单独完成。

推荐阅读: ../Chapter01/00_gzip

bzip2

bzip2 是一款自由软件,以开源软件协议发布的数据压缩算法及程序,以 .bz2 为扩展名结尾。bzip2 只是一个数据压缩工具,而不是归档工具,在这一点上它与 gzip 类似。

bzip2 是一个基于 Burrows-Wheeler 变换的无损压缩软件,压缩效果比传统的 gzip 或 ZIP 的压缩效率更高,但是它的压缩速度较慢。bzip2 利用先进的压缩技术,能够把文件压缩到 10% 至 15%,压缩的速度和解压的效率都非常高,并且支持大多数压缩格式,包括 tar、gzip 等。

推荐阅读: bzip2 压缩文件

zip

zip 是一个应用广泛的跨平台的打包+压缩工具,压缩文件的扩展名为 .zip

zip 是一种相当简单的分别压缩每个文件的存档格式。分别压缩文件允许不读取额外的数据而检索独立的文件;理论上,允许对不同的文件使用不同的算法。

提示

压缩工具对比

  • bzip2 gizp 命令会在压缩文件时替换原始文件,tar zip 不会替换
  • 除 bzip2 以外,压缩文件的权限将基于 umask 设置。bzip2 会保留原始文件的权限
  • zip 创建的压缩文件可以在 Windows 及 MacOS 和其他 Unix 系统即解压,兼容性更强

常用解压/压缩命令

tar

压缩:tar -cvf FileName.tar DirName
解压:tar -xvf FileName.tar

.gz

压缩:gzip FileName
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz

.tar.gz 或 .tgz

压缩:tar -zcvf FileName.tar.gz DirName
解压:tar -zxvf FileName.tar.gz

.bz2

压缩:bzip2 -z FileName
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2

.tar.bz2

压缩:tar -jcvf FileName.tar.bz2 DirName
解压:tar -jxvf FileName.tar.bz2

.Z

压缩:compress FileName
解压:uncompress FileName.Z

.tar.Z

压缩:tar -Zcvf FileName.tar.Z DirName
解压:tar -Zxvf FileName.tar.Z

.zip

压缩:zip FileName.zip DirName
解压:unzip FileName.zip

.rar

压缩:rar -a FileName.rar DirName
解压:rar -x FileName.rar