有两个不同但相关的任务。将文件树(包括文件名,目录结构,文件系统权限,所有权和任何其他元数据)打包到字节流中称为
归档。删除字节流中的冗余以产生较小的字节流称为压缩。
在Unix上,这两个操作是分开的,每个操作都有不同的工具。在大多数其他平台(当前和历史平台)上,组合工具可以同时执行归档和压缩。
(gzip和其他模仿gzip界面的程序通常可以选择将原始文件名存储在压缩输出中,但这与CRC或其他检测损坏的检查一起是它们可以存储的唯一元数据。)
将压缩与归档分开是有优势的。归档是特定于平台的(需要保留的文件系统元数据相差很大),但是实现是简单明了的,很大程度上受I / O限制,并且随时间变化不大。压缩是与平台无关的,但是实现受到CPU的限制,并且算法也在不断改进,以利用现代硬件可以解决此问题的资源的增加。
最受欢迎的Unix归档器是tar
,尽管还有其他诸如cpio
和ar
。(Debian软件包是ar
归档文件,而
cpio
通常用于初始ramdisk。)从(最旧到最年轻) tar
已经或经常与compress
(.Z),gzip
(。gz),
(。bz2)bzip2
和xz
(.xz)等压缩工具结合使用。,而不是同时出现从最坏到最佳压缩的情况。
进行tar
存档和压缩是不同的步骤:压缩器对tar
文件格式一无所知。这意味着从压缩的tar
存档中提取单个文件需要解压缩所有先前的文件。这通常称为“固定”存档。
同样,由于tar是一种“流”格式(需要在管道中使用),因此tar归档文件中没有全局索引,列出tar归档文件的内容与提取它一样昂贵。
相比之下,Zip和RAR和7-zip(现代Windows平台上最流行的存档器)通常分别压缩每个文件,并且对元数据进行轻度压缩(如果有的话)。这样可以便宜地列出档案中的文件并提取单个文件,但是这意味着不能利用同一档案中多个文件之间的冗余来增加压缩率。虽然通常压缩已压缩的文件不会进一步减小文件的大小,但有时您可能会在zip文件中看到一个zip文件:第一个zip会将很多小文件变成一个大文件(可能禁用了压缩),第二个然后压缩成一个单独的实体。
在不同的平台和理念之间存在交叉授粉:gzip
本质上zip
是没有其存档程序的压缩机,而xz
本质上7-zip
是没有其存档程序的压缩机。
还有其他专用压缩机。对PPM变体及其后继ZPAQ
进行了优化,以实现最大压缩,而无需考虑资源消耗。它们可以轻松消耗尽可能多的CPU和RAM,而解压缩与压缩一样费力(相比之下,最广泛使用的压缩工具是非
对称的:解压缩比压缩便宜)。
在另一端lzo
,,snappy
和LZ4
是“轻型”压缩机,其设计旨在以压缩为代价实现最高速度和最低资源消耗。它们在文件系统和其他对象存储中被广泛使用,但在独立工具中则较少使用。
那你该选哪一个呢?
归档:
由于您使用的是Ubuntu,因此没有真正的理由使用除tar
归档以外的任何方式,除非您试图制作易于在其他地方读取的文件。
zip
普遍性是很难击败的,但是它不是以Unix为中心的,并且不会保留文件系统的权限和所有权信息,而且其固有的压缩能力已过时。7-zip和RAR(和ZPAQ)具有更现代的压缩功能,但同样不适合归档Unix文件系统(尽管没有什么可以阻止您将它们用作压缩程序了)。RAR也是专有的。
压缩:
为了获得最大的压缩效果,您可以看一下基准,例如http://mattmahoney.net/dc/text.html上的大量基准。这应该使您更好地了解所涉及的权衡。
但是,您可能不希望最大压缩率。太贵了。
xz
是现代Unix系统上最流行的通用压缩工具。我相信7-zip也可以读取xz文件,因为它们密切相关。
最后:如果您要为短期存储以外的任何内容归档数据,则应选择开源且最好是开源的东西,以最大程度地减少以后的麻烦。