介绍
有很多原因你想要在计算机上压缩文件和目录。 一些更直接的优点是节省磁盘空间和使用更少的带宽用于网络通信。
在本指南中,我们将讨论一些压缩数据的不同方法,并讨论一些关于各种方法的一些折衷。 我们还将涉及一些相关操作,如归档,这使我们的压缩工具更加灵活。
我们将在Ubuntu 12.04 VPS实例上演示这些工具,但是在任何现代Linux发行版上,它们的工作方式都是完全一样的。
压缩和归档基础
在我们进入我们将要使用的实际工具之前,我们应该定义我们的术语,并讨论一些压缩和归档技术的不同特性。
压缩是使用不同的算法和数学计算减少磁盘上的文件的大小的一种方式。 文件以某些方式格式化,使其一般结构有些可预测,即使它们的内容不同。 此外,内容本身经常重复。 这两个领域都表示采用压缩技术的机会。
有损和无损压缩
当讨论关于计算机和文件类型的压缩时,相同的术语可以意味着取决于上下文的几个不同的事物。 让我们以一个MP3音乐文件为例。 MP3是用于从较大的源音乐文件创建较小文件的压缩声音文件。
这种类型的压缩与我们将在本指南中讨论的根本不同。 这是因为通过分析音频文件的波形来创建MP3,并且基本上确定哪些数据可以永久丢弃,同时仍然保留原件的精神或一般声音。
这被称为有损压缩方法,因为它确实失去了原始文件,不让它进入MP3的信息。 以后不能将MP3转换回相同的源文件。
压缩对于用户可能是不明显的,但它不包含原始的所有相关信息。 压缩比越高,压缩将开始影响音频的显着部分。
另一个例子是JPEG图像。 它们被压缩的越多,丢失的重要数据越多,压缩就越明显。 JPEG压缩实用程序将尝试查找彼此足够接近的颜色的字段,并用单个颜色替换整个字段。 所使用的压缩比越大,以这种方式覆盖的颜色范围越大。
可替代地,一个无损压缩方法创建一个文件小于能够被用来重构原始文件中的原始小。 无损压缩是我们将在本指南中介绍的类型。 这种类型的压缩不使用近似来压缩数据,而是使用某些算法来识别文件的重复部分。 它删除这些并用占位符替换它们。 它继续并替换稍后出现的模式
引用同一个占位符。
这允许计算机在较少的磁盘空间上存储信息。 将此过程视为创建定义数据块的变量列表,然后再使用这些变量填充程序。 这些实际上是每个无损压缩技术使用的两个阶段:将高度重复的值映射到更小的可以容易地被引用的那些值,然后用参考改变每个值的出现。
此外,现代化的无损压缩技术被认为是自适应的 。 这意味着他们不会在开始分析整个输入文件,并从中创建参考替换的“字典”。 相反,他们会分析文件,并根据实际重复的数据重写字典。 随着过程的继续,字典逐渐变得更高效。
档案背景
“归档”数据的想法通常意味着备份它并将其保存到安全的位置,通常以压缩格式。 Linux服务器上的“归档”通常有不同的含义。 通常它指的是tar
文件。
历史上,来自服务器的数据通常备份到磁带归档,磁带归档是可用于存储顺序数据的磁带设备。 这仍然是一些行业的首选备份方法。 为了有效地做到这一点, tar
项目,目标是让你可以地址和文件系统操作很多文件,有完整的权限和元数据,为一个文件。 然后,可以从归档中提取文件或整个文件系统。
基本上, tar
文件是创建一个方便的方法来分发,存储,备份和操纵的相关文件组的文件格式。 我们将在本指南中讨论档案,因为档案在存档过程中经常被压缩,以便以更有效的方式存储数据。
比较不同的压缩工具
Linux有许多不同的压缩工具可用。 他们每个在某些领域做出牺牲,每个都有自己的具体优势。 我们将自己偏置朝着与合作的压缩方案tar
,因为他们会比其他方法更灵活。
gzip压缩
该gzip
工具通常归类为Linux机器上压缩数据的“经典”的方法。 它自1992年以来一直在发展,仍然有很多事情要做。
该gzip
工具使用的压缩算法所知道的“DEFLATE”,算法在其他流行的技术,如PNG图像格式的HTTP网页协议还使用和SSH安全外壳协议。
其主要优点之一是速度。 它可以以比一些竞争技术高得多的速率压缩和解压缩数据,特别是在比较每个实用程序最紧凑的压缩格式时。 它在压缩和解压缩期间的存储器使用方面也是非常资源有效的,并且在优化最佳压缩时似乎不需要更多的存储器。
另一个考虑是兼容性。 由于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
如果你需要管的结果,另一个工具,你可以告诉gzip
通过发送压缩文件到标准输出-c
标志。 在这个例子中,我们将直接将它直接转换为一个文件:
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
是被称为“挖洞轮车算法”的算法的实现。 在方法论这种差异导致一系列的优势和劣势是从完全不同gzip
。
大多数用户最重要的权衡是以更长的压缩时间为代价进行更大的压缩。 该bzip2
工具可以创造出比显著更紧凑的文件gzip
,但需要更长的时间来实现这些结果由于更复杂的算法。
幸运的是,减压时间并不吃亏尽可能压缩时间,所以它可能是有利的使用来分发文件bzip2
格式,因为你只会遭受压缩过程中的时间消耗,并能分发可在解压缩较小的文件合理的时间。 减压时间仍然比大得多gzip
,但不具有大的作为压缩操作的影响。
要记住的另一件事是,对内存的要求是大于gzip
。 这不会对大多数机器产生影响,但在小型嵌入式设备上,这可能会影响您的选择。 您可以选择传递-s
标志,这将削减一半的内存需求,同时也将导致较低的压缩比。
这个机构压缩文件一般都给出了.bz2
文件扩展名。
要创建bzip2
压缩文件,可以简单类型是这样的:
bzip2 afile
这将压缩文件,并给它名称“afile.bz2”。
正如上面提到的,你可以传递-s
标志,表示该实用程序应在降低内存模式下运行。 这不会压缩,但它不需要尽可能多的资源。
bzip2 -s afile
虽然bzip2
工具编号标志,它们意味着什么有所不同比他们做gzip
。 这里,它们表示实用程序实现其压缩的块大小,因此这是更多的内存使用量对压缩大小的测量,而不是时间vs压缩大小。 默认行为是-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
这将处理该文件并产生一个名为“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
要创建tar
归档,然后与压缩gzip
实用程序,您可以通过-z
标志,它表明您希望使用gzip
对存档的顶部压缩。 其实, tar
标志实际上并不需要领导“ -
最喜欢的工具。 完成压缩档案的常见习语是:
tar czvf compressed.tar.gz directory1
这将创建一个存档( -c
从一个名为“directory1目录”目录)。 它会创建详细的输出,以生成的存档压缩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
标志,这是gzip
特异性,与-j
标志。
这意味着压缩的归档创建命令修改为:
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
这将给你完整的目录结构。
结论
希望你现在有足够的信息来做出明智的决定,在不同的情况下支持哪种压缩方法。 我们在这篇文章中讨论的所有压缩方案都有非常有吸引力的优势,具体取决于您的情况的具体要求。
重要的是要知道每个解决方案可能固有的性能缺点和兼容性问题。 你给予这些关注的重量完全取决于你正在操作的机器和你必须支持什么样的客户端。 大多数现代机器不应该过多关注这些细节,但是如果在与旧机器交互时盲目实现压缩类型,它们可能导致问题。