Linux服务器上的文件压缩工具简介
介绍
您想要在计算机上压缩文件和目录的原因有很多。 一些更直接的好处是节省磁盘空间并使用更少的带宽进行网络通信。
在本指南中,我们将讨论一些不同的数据压缩方法,并讨论一下各种方法的一些权衡。 我们还将涉及一些相关的操作,例如归档,这使我们的压缩工具更加灵活。
我们将在 Ubuntu 12.04 VPS 实例上演示这些工具,但它们在任何现代 Linux 发行版上的运行方式几乎完全相同。
压缩和归档基础
在我们开始使用我们将使用的实际工具之前,我们应该定义我们的术语并讨论压缩和归档技术的一些不同特征。
Compression 是一种使用不同算法和数学计算来减小磁盘上文件大小的方法。 文件以某些方式进行格式化,即使它们的内容有所不同,它们的一般结构也有些可预测。 此外,内容本身经常重复。 这两个领域都代表了采用压缩技术的机会。
有损和无损压缩
在讨论有关计算机和文件类型的压缩时,相同的术语可能意味着一些不同的东西,具体取决于上下文。 让我们以一个 MP3 音乐文件为例。 MP3 是一种压缩的声音文件,用于从较大的源音乐文件创建较小的文件。
这种类型的压缩与我们将在本指南中讨论的内容根本不同。 这是因为 MP3 是通过分析音频文件的波形来创建的,并且基本上可以确定哪些数据可以永久丢弃,同时仍保留原件的精神或一般声音。
这被称为 有损 压缩方法,因为它确实会丢失原始文件中的信息,这些信息不会进入 MP3。 您不能稍后将 MP3 转换回相同的源文件。
用户可能不会注意到压缩,但它并不包含原始文件的所有相关信息。 压缩比越高,压缩越会开始影响音频的重要部分。
另一个例子是JPEG图像。 它们被压缩得越多,丢失的重要数据就越多,压缩越明显。 JPEG 压缩实用程序将尝试找到彼此足够接近的颜色字段,并用单一颜色替换整个字段。 使用的压缩比越大,以这种方式覆盖的颜色范围就越大。
或者, 无损 压缩方法会创建一个比原始文件更小的文件,可用于重建原始文件。 无损压缩是我们将在本指南中介绍的类型。 这种类型的压缩不使用近似值来压缩数据,而是使用某些算法来识别文件的重复部分。 它删除这些并用占位符替换它们。 它继续并用对同一占位符的引用替换后来出现的模式。
这允许计算机将信息存储在更少的磁盘空间上。 将此过程视为创建定义数据块的变量列表,然后稍后使用这些变量填充程序。 这实际上是每个无损压缩技术使用的两个阶段:将高度重复的值映射到可以轻松引用的较小的值,然后使用引用更改每个值的出现。
此外,现代无损压缩技术据说是自适应。 这意味着他们不会在开始时分析整个输入文件并从中创建引用替换的“字典”。 相反,他们会边走边分析文件,并根据实际重复的数据重写字典。 随着过程的继续,字典逐渐变得更有效率。
档案背景
“存档”数据的概念通常意味着备份数据并将其保存到安全位置,通常采用压缩格式。 Linux 服务器上的“存档”通常具有略微不同的含义。 通常它是指 tar
文件。
从历史上看,来自服务器的数据通常备份到磁带存档中,磁带存档是可用于存储顺序数据的磁带设备。 这仍然是某些行业的首选备份方法。 为了有效地执行此操作,创建了 tar
程序,以便您可以将文件系统中的许多文件作为一个文件进行寻址和操作,并且具有完整的权限和元数据。 然后,您可以从存档中提取文件或整个文件系统。
基本上,tar
文件是一种文件格式,它创建了一种方便的方式来分发、存储、备份和操作相关文件组。 我们还将在本指南中讨论存档,因为存档通常在存档过程中被压缩,以便以更有效的方式存储数据。
比较不同的压缩工具
Linux 有许多不同的压缩工具可用。 他们每个人都在某些领域做出牺牲,每个人都有自己的特定优势。 我们将倾向于使用 tar
的压缩方案,因为它们将比其他方法灵活得多。
gzip 压缩
gzip
工具通常被归类为在 Linux 机器上压缩数据的“经典”方法。 它自 1992 年以来一直存在,仍在开发中,并且还有很多事情要做。
gzip
工具使用称为“DEFLATE”的压缩算法,该算法也用于其他流行技术,如 PNG 图像格式、HTTP Web 协议和 SSH 安全外壳协议。
它的主要优点之一是速度。 它可以以比某些竞争技术高得多的速率压缩和解压缩数据,尤其是在比较每个实用程序最紧凑的压缩格式时。 它在压缩和解压缩期间的内存使用方面也非常节省资源,并且在优化最佳压缩时似乎不需要更多内存。
另一个考虑因素是兼容性。 由于 gzip
是一个如此古老的工具,几乎所有的 Linux 系统,无论年龄大小,都将拥有可用于处理数据的工具。
它最大的缺点是它对数据的压缩不如其他一些选项那么彻底。 如果您正在进行大量快速压缩和解压缩,这对您来说可能是一种不错的格式,但如果您打算压缩一次并存储文件,那么其他选项可能会有优势。
通常,gzip
文件以 .gz
扩展名存储。 您可以通过键入如下命令来使用 gzip
压缩文件:
gzip源文件
这将压缩文件并将名称更改为您系统上的 sourcefile.gz
。
如果你想递归压缩整个目录,你可以像这样传递 -r
标志:
gzip -r目录1
这将向下移动一个目录并单独压缩每个文件。 这通常不是首选,通过将目录归档并将生成的文件作为一个整体压缩可以获得更好的结果,我们将在稍后展示如何做到这一点。
要了解有关压缩文件的更多信息,您可以使用 -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
标志(及其别名 --fast
)代表最快但最不彻底的压缩。 -9
标志(及其别名 --best
)代表最慢和最彻底的压缩。 默认选项是 -6
,这是一个很好的中间立场。
gzip -9 compressme
要解压缩文件,只需将 -d
标志传递给 gzip
(也有类似 gunzip
的别名,但它们的作用相同):
gzip -d test.gz
bzip2 压缩
另一种常见的压缩格式和工具是bzip2
。 虽然比 gzip
更现代一些,在 1996 年首次推出,bzip2
作为 gzip
的传统替代品被大量实现。
gzip
依赖于“DEFLATE”算法,而 bzip2
是一种称为“Burrows-Wheeler 算法”的算法的实现。 这种方法论上的差异导致了一组与 gzip
完全不同的优点和缺点。
对于大多数用户而言,最重要的权衡是以更长的压缩时间为代价进行更大的压缩。 bzip2
工具可以创建比 gzip
更紧凑的文件,但由于算法更复杂,需要更长的时间才能获得这些结果。
幸运的是,解压缩时间不会像压缩时间那样受到影响,因此使用 bzip2
格式分发文件可能是有利的,因为您只会在压缩期间遭受时间损失并且能够分发较小的文件可以在合理的时间内解压。 解压时间仍然比gzip
大很多,但没有压缩操作那么大的影响。
要记住的另一件事是内存要求大于 gzip
。 这不会对大多数机器产生影响,但在小型嵌入式设备上,这可能会影响您的选择。 您可以选择传递 -s
标志,这会将内存需求减少大约一半,但也会导致较低的压缩比。
使用这种机制压缩的文件通常被赋予 .bz2
文件扩展名。
要创建 bzip2
压缩文件,您可以简单地键入如下内容:
bzip2文件
这将压缩文件并将其命名为“afile.bz2”。
如上所述,您可以传递 -s
标志来表示该实用程序应该在减少内存模式下运行。 这也不会压缩,但它不需要那么多资源。
bzip2 -s afile
虽然 bzip2
实现了编号标志,但它们的含义与 gzip
的含义有些不同。 在这里,它们代表实用程序设法实现其压缩的块大小,因此这更像是内存使用与压缩大小的衡量,而不是时间与压缩大小的衡量。 默认行为是 -9
标志,这意味着高内存使用(相对)但更大的压缩。
bzip2 -1 file
要解压 bzip
压缩文件,您可以传递 -d
标志:
bzip2 -d file.bz2
这将返回一个名为“file”的未压缩文件。
xz 压缩
该领域相对较新的是 xz
压缩机制。 该压缩工具于 2009 年首次发布,从那时起就获得了稳定的追随者。
xz
压缩实用程序利用称为 LZMA2 的压缩算法。 此算法比前两个示例具有更高的压缩比,当您需要在有限的磁盘空间上存储数据时,它是一种很好的格式。 它创建较小的文件。
在 bzip2
遭受的大多数相同领域中,这又是有代价的。 虽然 xz
生成的压缩文件比其他实用程序小,但执行压缩需要 显着 更长的时间。 例如,在相当大的文件上使用大量压缩标志,gzip
可能需要大约半分钟,bzip2
可能需要大约一分钟,而 xz
可能需要大约四五分钟。
xz
压缩工具也在内存需求方面受到影响,有时比其他方法高出一个数量级。 如果您使用的是内存充足的系统,这可能不是问题,但请记住这一点。
虽然压缩时间可能比优选的要长得多,但解压缩时间实际上相对较好。 虽然它在解压缩速度方面从未接近 gzip
,但通常在解压缩时 比 bzip2
快得多 。 用于解压缩的内存使用量也不是天文数字(但相对而言仍然相当高)。
这组优点和缺点使其成为分发软件等文件的绝佳格式。 您将不得不预先吃掉压缩时间的损失,但您的文件的使用者将受益匪浅。 他们将有一个紧凑的文件,可以快速解压缩。
这种格式的另一个隐藏的缺点是,由于其年代久远,某些旧系统可能不支持它。 如果您要获得最大的兼容性,您可能会被迫寻找其他地方。
以这种格式创建的文件通常采用 .xz
的扩展名。
要压缩文件,只需调用不带任何参数的实用程序:
xz 文件
这将处理该文件并生成一个名为“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
这会将数据解压缩到一个名为“large_file”的文件中。
使用带压缩的 Tar 归档
虽然各个压缩方法本身很有用,但大多数情况下您会看到它们与 tar
配对以压缩文件存档。 这允许我们保留目录结构、权限等。 我们打包的文件。
tar
命令实际上对这种关系非常坦率。 它包括命令行标志,可用于在归档过程完成后自动调用相关的压缩工具,只需一步完成。
使用 tar 和 gzip
要创建然后使用 gzip
实用程序压缩的 tar
存档,您可以传递 -z
标志,这表明您希望使用 gzip
压缩在档案的顶部。 实际上,tar
标志实际上并不像大多数工具那样需要前导“-
”。 完成压缩档案的一个常见习语是:
tar czvf压缩的 .tar.gz目录1
这将从名为“directory1”的目录中创建一个存档(-c
)。 它将创建详细输出,使用 gzip
压缩生成的存档,并输出到名为“compressed.tar.gz”的文件(已被 gzip 压缩的 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
进行归档,您可以将 -z
标志替换为 -j
标志,该标志是 gzip
特定的。
这意味着压缩存档创建命令被修改为:
tar cjvf bzipcompressed .tar.bz2目录2
同样,您可以通过传递 -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目录3
要显示信息,请使用相同的机制:
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
这将使您完整的目录结构恢复原状。
结论
希望您现在有足够的信息来做出明智的决定,以决定在不同情况下支持哪种压缩方法。 我们在这篇文章中讨论的所有压缩方案都具有非常有吸引力的优势,具体取决于您的具体情况。
了解每个解决方案可能固有的性能缺陷和兼容性问题非常重要。 您对这些问题的重视程度完全取决于您正在操作的机器以及您必须支持什么样的客户。 大多数现代机器不必过多关注这些细节,但如果您在与旧机器交互时盲目实施压缩类型,它们可能会导致问题。