引言

在计算机上压缩文件和目录有很多原因。 一些更直接的好处是节省磁盘空间,减少网络通信的带宽。

在本指南中,我们将讨论一些压缩数据的不同方法,并讨论各种方法的一些折衷。 我们还将介绍一些相关的操作,比如归档,这使得我们的压缩工具更加灵活。

我们将在 Ubuntu 12.04 VPS 实例上演示这些工具,但它们在任何现代 Linux 发行版上的操作几乎完全相同。

压缩和归档基础

在介绍我们将要使用的实际工具之前,我们应该定义我们的术语并讨论压缩和归档技术的一些不同特性。

压缩是一种使用不同的算法和数学计算减少磁盘上文件大小的方法。 文件以某种方式进行格式化,使其总体结构在一定程度上可预测,即使其内容有所不同。 此外,内容本身经常被重复。 这两个领域都提供了使用压缩技术的机会。

洛西和无损数据压缩

当讨论关于计算机和文件类型的压缩时,相同的术语可能根据上下文有不同的含义。 让我们以一个 MP3音乐文件为例。 Mp3是一种压缩声音文件,用于从较大的源音乐文件创建较小的文件。

这种类型的压缩与我们将在本指南中讨论的压缩有着根本的不同。 这是因为 MP3是通过分析音频文件的波形来创建的,并且基本上弄清楚哪些数据可以被永久丢弃,同时仍然保留原始文件的精神或一般声音。

这个方法被称为有损数据压缩方法,因为它确实会丢失原始文件中没有进入 MP3的信息。 以后不能将 MP3转换回同一源文件。

压缩对于用户来说可能是不可察觉的,但是它并不包含原始文件的所有相关信息。 压缩比越高,压缩会对音频的重要部分产生越大的影响。

另一个例子是 JPEG 图像。 它们被压缩得越多,丢失的重要数据就越多,压缩的效果也就越明显。 Jpeg 压缩实用程序将尝试找到彼此足够接近的颜色字段,并将整个字段替换为单个颜色。 使用的压缩比越大,以这种方式覆盖的颜色范围就越大。

或者,无损数据压缩方法创建一个比原始文件更小的文件,可以用来重建原始文件。 无损数据压缩是我们将在本指南中介绍的类型。 这种类型的压缩不使用近似值来压缩数据,而是使用特定的算法来识别文件的重复部分。 它删除这些内容并用占位符替换它们。 它继续运行,并使用对同一占位符的引用替换后面出现的模式。

这使得计算机可以在更少的磁盘空间上存储信息。 可以将这个过程看作是创建一个变量列表,用于定义数据块,然后在稍后使用这些变量填充程序。 这些实际上是每个无损数据压缩技术使用的两个阶段: 将高度重复的值映射到较小的容易引用的值,然后随着引用改变这些值的出现。

此外,现代无损数据压缩技术被认为是适应性的。 这意味着他们不会在开始时分析整个输入文件,并创建引用替换的“字典”。 相反,他们一边分析文件,一边根据实际重复的数据重写字典。 随着流程的继续,字典的效率逐渐提高。

档案背景

“归档”数据的想法通常意味着将其备份并保存到安全位置,通常是以压缩格式保存。 通常,Linux 服务器上的“归档”的含义略有不同。 通常它指的是一个 tar 文件。

历史上,来自服务器的数据通常备份到磁带存档中,磁带存档是一种磁带设备,可用于存储顺序数据。 这仍然是一些行业的首选备份方法。 为了有效地完成这项工作,创建了 tar 程序,这样您就可以在一个文件系统中以完整的权限和元数据作为一个文件来寻址和操作许多文件。 然后可以从归档文件中提取文件或整个文件系统。

基本上,tar 文件是一种文件格式,它创建了一种分发、存储、备份和操作相关文件组的方便方式。 我们将在本指南中谈论档案,因为档案经常在存档过程中被压缩,以便以更有效的方式存储数据。

比较不同的压缩工具

Linux 有许多不同的压缩工具可用。 他们每个人都在某些领域做出牺牲,而且每个人都有自己的长处。 我们将倾向于使用焦油的压缩方案,因为它们比其他方法灵活得多。

Gzip 压缩

Gzip 工具通常被归类为在 Linux 机器上压缩数据的“经典”方法。 自1992年以来,它一直处于发展之中,并且仍然有许多事情在进行中。

Gzip 工具使用一种称为“ DEFLATE”的压缩算法,该算法也用于其他流行技术,如 PNG 图像格式、 HTTP web 协议和 SSH 安全 shell 协议。

它的主要优点之一是速度。 它可以以比某些竞争技术更高的速度压缩和解压缩数据,特别是在比较每个实用程序最紧凑的压缩格式时。 它在压缩和解压缩过程中的内存使用方面也非常节省资源,而且在优化最佳压缩时似乎不需要更多的内存。

另一个考虑因素是兼容性。 由于 gzip 是一个如此古老的工具,几乎所有的 Linux 系统,不管年龄大小,都有可用的工具来处理数据。

它最大的缺点是对数据的压缩不如其他选项那么彻底。 如果您正在进行大量的快速压缩和解压缩,那么这可能是一种适合您的格式,但是如果您计划压缩一次并存储文件,那么其他选项可能会有优势。

通常,gzip 文件存储在。 Gz 延伸。 你可以用 gzip 压缩文件,只要输入这样的命令:

gzip sourcefile

这将压缩文件并将系统名称更改为 sourcefile.gz。

如果你想递归地压缩整个目录,你可以像这样传递-r 标志:

gzip -r directory1

这将通过一个目录向下移动,并单独压缩每个文件。 这通常不是首选,通过对目录进行归档并将结果文件压缩为一个整体,可以获得更好的结果,我们稍后将展示如何做到这一点。

要了解更多关于压缩文件的信息,你可以使用-l 标志,它会给你一些统计数据:

gzip -l test.gz
         compressed        uncompressed  ratio uncompressed_name
               5133               14073  63.7% test

如果需要将结果通过管道传送到另一个实用程序,可以通过使用 -c 标志告诉 gzip 将压缩文件发送到标准输出。 在这个例子中,我们只需再次将它直接导入到一个文件中:

gzip -c test > test.gz

可以通过在1和9之间传递编号标志来调整压缩优化。 1标志(及其别名——快)表示最快,但是最不彻底的压缩。 9标志(及其别名 -- best)代表了最慢和最彻底的压缩。 默认选项是 -6,这是一个很好的折中方案。

gzip -9 compressme

要解压缩文件,只需将-d 标志传递给 gzip (也有诸如 gunzip 之类的别名,但它们的作用是相同的) :

gzip -d test.gz

2 Compression

另一种常见的压缩格式和工具是 bzip2。 虽然比 gzip 更现代一些,bzip2是1996年首次引入的,但它作为 gzip 的传统替代品得到了大量的实现。

Gzip 依赖于“ DEFLATE”算法,而 bzip2是一种称为“ Burrows-Wheeler 算法”的算法的实现。 这种方法上的差异导致了一系列与 gzip 完全不同的优点和缺点。

对于大多数用户来说,最重要的权衡就是以更长的压缩时间为代价获得更大的压缩。 Bzip2工具可以比 gzip 创建更加紧凑的文件,但是由于更复杂的算法,需要更长的时间才能达到这些结果。

幸运的是,解压缩时间不像压缩时间那么长,所以使用 bzip2格式分发文件可能是有利的,因为在压缩过程中只会遭受时间损失,并且能够分发在合理时间内解压缩的较小文件。 解压缩时间仍然比 gzip 大得多,但是没有压缩操作那么大的影响。

需要记住的另一件事是,内存需求大于 gzip。 这对大多数机器不会有影响,但对于小型嵌入式设备,这可能会影响您的选择。 你可以选择传递 a-s 标志,这样可以大致减少一半的内存需求,但是也会导致更低的压缩比。

使用此机制压缩的文件通常具有. bz2文件扩展名。

要创建一个 bzip2压缩文件,你可以简单地输入如下命令:

bzip2 afile

这将压缩文件并将其命名为“ afile.bz2”。

如上所述,您可以传递-s 标志来表示实用程序应该在减少内存模式下运行。 这也不会压缩,但是不需要那么多的资源。

bzip2 -s afile

虽然 bzip2实现了编号标志,但它们的意思与 gzip 有些不同。 在这里,它们代表了实用程序实现其压缩的块大小,因此这更多的是内存使用量与压缩大小的度量,而不是时间与压缩大小的度量。 默认行为是 -9标志,这意味着内存使用率较高(相对而言) ,但压缩量更大。

bzip2 -1 file

要解压 bzip 压缩文件,可以传递-d 标志:

bzip2 -d file.bz2

这将返回一个称为“ file”的未压缩文件。

Xz Compression

空间中的一个相对新来者是 xz 压缩机制。 这个压缩工具于2009年首次发布,从那以后就获得了稳定的追随者。

Xz 压缩工具使用一种称为 LZMA2的压缩算法。 这个算法比前两个例子有更大的压缩比,当你需要在有限的磁盘空间上存储数据时,它是一个很好的格式。 它创建更小的文件。

这也是有代价的,在 bzip2所遭受的大多数领域。 虽然 xz 生成的压缩文件比其他实用程序小,但进行压缩所需的时间要长得多。 例如,对于一个相当大的文件,使用较重的压缩标志,gzip 可能需要大约半分钟,bzip2可能需要大约一分钟,xz 可能需要大约四到五分钟。

Xz 压缩工具在内存需求方面也受到了冲击,有时甚至比其他方法的数量级更高。 如果您在一个内存充足的系统上,这可能不是一个问题,但是需要记住这一点。

虽然压缩时间可能比较长,但是解压缩时间实际上是比较好的。 虽然从解压速度上来说,它从来没有接近 gzip,但在解压缩时,它通常比 bzip2快得多。 用于解压缩的内存使用量也不是天文数字(但仍然相当高)。

这一系列的优点和缺点使得它成为像软件一样分发文件的一种很好的格式。 你将不得不预先承受压缩时间的惩罚,但是你文件的消费者将会受益良多。 他们将有一个紧凑的文件,将解压缩迅速。

这种格式的另一个隐藏的缺点是,由于它的年龄,它可能在一些旧的系统上不受支持。 如果你想获得最大的兼容性,你可能会被迫去别处寻找。

以这种格式创建的文件通常扩展名为.xz。

要压缩文件,只需调用没有任何参数的实用程序:

xz file

这将处理该文件并生成一个名为“ file.xz”的文件。

要列出关于文件压缩的统计信息,可以在压缩文件上传递-l 标志:

xz -l test.xz
Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename
    1       1      5,016 B     13.7 KiB  0.356  CRC64   test.xz

如果需要将压缩输出发送到标准输出,可以使用 -c 标志向实用程序发出信号。 这里我们可以再次将它直接导回到一个文件中:

xz -c test > test.xz

对于编号标志,xz 使用较低的数字表示更快的压缩。 实际上,它有一个 -0标志用于最快预置。 6标志是默认的,对于大多数用例来说是一个很好的中间地带。 如果您确实需要为较大的文件推送压缩,您可以使用较高的标志,这可能需要很长的时间,但可能会显示一些收益。

如果您需要更多的压缩,并且不关心时间、内存需求等,那么您可以使用 -e 标志,它使用另一种“极端”压缩变量。 这也可以用数字标志来修改它的性能:

xz -e -9 large_file

这将需要很长的时间,最终,可能不会显示非常显着的收益,但如果你需要的功能,选项是可用的。

要解压缩文件,再次传递-d 标志:

xz -d large_file.xz

这将把数据解压缩到一个名为“大文件”的文件中。

使用 Tar 归档和压缩

虽然单独的压缩方法本身就很有用,但是您经常会看到它们与 tar 一起压缩文件归档。 这允许我们保留包装文件的目录结构、权限等。

Tar 命令实际上对这种关系非常坦率。 它包括命令行标志,可用于在归档过程完成后自动调用相关的压缩工具,所有这些都在一个步骤中完成。

使用 tar 和 gzip

要创建 tar 归档文件,然后使用 gzip 实用程序对其进行压缩,您可以传递-z 标志,它表示您希望在归档文件顶部使用 gzip 压缩。 实际上,像大多数工具一样,tar flags 并不需要前导的“-”。 一个常见的用于完成压缩档案的习惯用法是:

tar czvf compressed.tar.gz directory1

这将从一个名为“ directory1”的目录创建一个归档(- c)。 它将创建详细的输出,用 gzip 压缩生成的归档文件,并将其输出到一个名为“ compressed.tar.gz”的文件(一个已被 gzipped 的 tar 文件)。

一旦文件被创建,我们可以通过使用-t 标志而不是创建标志来窥视其内部:

tar tzvf compressed.tar.gz
drwxr-xr-x demouser/demouser 0 2014-03-19 18:31 directory1/
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory1/httpd.conf.orig
-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory1/nginx.conf.orig
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory1/httpd.conf

为了稍后解压缩文件和展开存档,您可以使用-x 标志:

tar xzvf compressed.tar.gz

这将在工作目录中重新创建目录结构。

使用 tar 和 bzip2

要使用 bzip2进行归档,可以使用-j 标志替换特定于 gzip 的-z 标志。

这意味着压缩的存档创建命令被修改为:

tar cjvf bzipcompressed.tar.bz2 directory2

同样,您可以通过传递-t 标志来查看包含在归档中的文件:

tar tjvf bzipcompressed.tar.bz2
drwxr-xr-x demouser/demouser 0 2014-03-19 18:31 directory2/
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory2/httpd.conf.orig
-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory2/nginx.conf.orig
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory2/httpd.conf

你可以通过输入以下命令将文件和目录结构提取到工作目录文件夹中:

tar xjvf bzipcompressed.tar.bz2

使用 tar 和 xz

任何远程最新版本的 tar 都为 xz 压缩添加了类似的功能。 它们遵循使用 -j 标志的完全相同的格式。

tar cJvf xzcompressed.tar.xz directory3

要显示信息,使用相同的机制:

tar tJvf xzcompressed.tar.xz
drwxr-xr-x demouser/demouser 0 2014-03-19 18:31 directory3/
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:31 directory3/httpd.conf.orig
-rw-r--r-- demouser/demouser 2295 2014-03-19 18:31 directory3/nginx.conf.orig
-rw-r--r-- demouser/demouser 5458 2014-03-19 18:21 directory3/httpd.conf

按照相同的模式提取:

tar xJvf xzcompressed.tar.xz

这将完整地返回您的完整目录结构。

总结

希望您现在已经掌握了足够的信息,可以对在不同情况下应该使用哪种压缩方法作出明智的决定。 我们在本文中讨论的所有压缩方案都具有非常吸引人的优点,这取决于您的具体情况的需求。

了解每个解决方案可能固有的性能缺陷和兼容性问题非常重要。 你对这些问题的重视程度完全取决于你所操作的机器以及你必须支持的客户类型。 大多数现代机器不应该对这些细节给予太多的关注,但是如果您在与旧机器交互时盲目地实现压缩类型,那么它们可能会导致问题。