我一直使用 TAR 和 ZIP 进行压缩,但最近我听说了*.Z
压缩算法。这给我带来了一个问题:
在所有这些压缩系统中,哪一个最适合一般用途和压缩?
运行一些测试后,我发现tar
,正如我所发现的,它实际上并没有压缩(除非明确指定)。也就是说,与其他压缩方法相比,它有什么好处?
我已经知道 ZIP 是最广泛使用的压缩系统,但我应该使用它来代替、、*.Z
或吗?*.7z
.tar
.tar.<insert ending here>
文章摘要:
- 我应该使用
*.tar
、、、、或来获得最佳压缩效果吗*.Z
?*.7z
.tar
.tar.<insert ending here>
- 如果 plain
*.tar
不能压缩,我们为什么要使用它?
编辑:并非所有算法都允许存储 Linux 权限(据我所知)。哪些算法允许,是否有某种 hack(或脚本)可用于存储权限?
答案1
tar
代表磁带存档。它所做的就是将文件及其元数据(权限、所有权等)打包成字节流,这些字节流可以存储在磁带驱动器(或文件)上,以后再恢复。压缩是一个完全独立的事情,如果需要,您以前必须通过外部实用程序将输出传输到管道中。GNU tar 很好,可以添加开关来告诉它自动通过适当的实用程序过滤输出,这是一种快捷方式。
Zip 和 7z 将归档和压缩功能结合在一起,形成自己的容器格式,它们旨在在 DOS/Windows 系统上打包文件,因此它们不存储 unix 权限和所有权。因此,如果您想存储正确备份的权限,则需要坚持使用 tar。如果您计划与 Windows 用户交换文件,那么 zip 或 7z 是不错的选择。zip 和 7zip 使用的实际压缩算法可以分别通过 uzinggzip
和tar 与 tar 一起使用lzma
。
lzma(又名 *.xz )具有最佳压缩率之一,并且解压缩速度也相当快,使其成为当今的首选。但是,它需要大量的 RAM 和 CPU 时间进行压缩。这个古老的压缩方法gzip
压缩速度要快得多,因此如果您不想投入那么多 CPU 时间,可以使用它。它还有一个更快的变体,称为 lzop。 bzip2
在 7zip/lzma 出现之前,它曾一度在很大程度上取代了 gzip,因为它具有更好的压缩率,因此仍然相当流行,但由于 7z/lzma 解压缩速度更快,压缩率也更高,因此现在它已不再受欢迎。该compress
实用程序通常将文件命名为 *.Z,它已经很古老并且早已被人遗忘。
zip 和 tar 之间的另一个重要区别是 zip 以小块的形式压缩数据,而压缩 tar 文件时,会一次性压缩整个文件。后者的压缩率更高,但是为了提取存档末尾的单个文件,您必须解压缩整个文件才能获得它。因此,zip 格式更适合从大型存档中提取单个或两个文件。7z 允许dar
您选择压缩整个文件(称为“固定”模式)或小块以便于分段提取。
答案2
这些算法的细节与本文无关1,因为它们并非 Linux 所特有,更不用说 Ubuntu 了。不过,你会发现一些不错的信息这里。
现在tar
,正如你所说,tar
它不是也从来不是一个压缩程序。相反,它是一个归档器;其主要目的是将许多小文件合并成一个大文件。从历史上看,这是为了方便在磁带驱动器上存储,因此得名:Tape ARchive。
如今,使用的主要原因tar
是减少系统上的文件数量。Unix 文件系统上的每个文件占用索引节点,文件越多,可用的 inode 就越少,当 inode 用完时,您就无法再创建新文件。简而言之,存储为数千个文件的相同数据量将比单个 tar 存档中的相同文件占用更多的硬盘空间。
为了说明,由于评论中对此提出了异议,在我的 68G/
分区上,我有以下数量的总 inode 和已使用的 inode(请记住 inode 数量取决于文件系统类型和分区的大小):
Inode count: 393216
Free inodes: 171421
如果我现在继续尝试创建比我的 inode 更多的文件:
$ touch {1..171422}
touch: cannot touch ‘171388’: No space left on device
touch: cannot touch ‘171389’: No space left on device
touch: cannot touch ‘171390’: No space left on device
touch: cannot touch ‘171391’: No space left on device
touch: cannot touch ‘171392’: No space left on device
touch: cannot touch ‘171393’: No space left on device
touch: cannot touch ‘171394’: No space left on device
touch: cannot touch ‘171395’: No space left on device
touch: cannot touch ‘171396’: No space left on device
touch: cannot touch ‘171397’: No space left on device
没有空间?但我有很多空间:
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 5,8G 4,3G 1,2G 79% /
如上所示,创建几十万个空文件会迅速耗尽我的 inode,我无法再创建新的 inode。如果我能做到tar
这一点,我就可以重新开始创建文件了。
文件越少,文件系统 I/O 的速度就越快,尤其是在 NFS 挂载的文件系统上。项目完成后,我总是将旧的工作目录打包成 tar,因为文件越少,程序find
运行的速度就越快。
有一个很好的答案在 Super User 上对此进行了更详细的介绍,但除了上述内容之外,其他tar
至今仍然受欢迎的基本原因是:
效率:使用
tar
类似的压缩程序进行管道传输gzip
更加高效,因为它避免了创建中间文件。tar
带有各种各样的花哨功能,这些功能是在其悠久的历史中设计的,使其特别适用于 *nix 备份(想想权限、文件所有权、将数据直接传送到 STDOUT 和通过 SSH 链接传输的能力......)惯性。我们已经习惯了
tar
。可以安全地假设它将在您可能使用的任何 *nix 上可用,这使得它非常便携并且对于源代码 tarball 来说很方便。
1这绝对是真的,与我对它们了解不够多而无法解释无关:)
答案3
有两个不同但相关的任务。将文件树(包括文件名、目录结构、文件系统权限、所有权和任何其他元数据)打包成字节流称为 归档。删除字节流中的冗余部分以产生更小的字节流称为压缩。
在 Unix 上,这两项操作是分开的,每个操作都有不同的工具。在大多数其他平台(当前和历史)上,组合工具同时执行归档和压缩。
(gzip 和其他模仿 gzip 界面的程序通常可以选择在压缩输出中存储原始文件名,但是这与 CRC 或其他用于检测损坏的检查一起是它们可以存储的唯一元数据。)
将压缩与归档分开有其优势。归档是特定于平台的(需要保留的文件系统元数据差异很大),但实现方式简单,主要受 I/O 限制,并且随时间变化不大。压缩与平台无关,但实现方式受 CPU 限制,并且算法在不断改进,以利用现代硬件可以为解决问题带来的更多资源。
最流行的 Unix 归档程序是tar
,尽管还有其他归档程序,例如cpio
和ar
。 (Debian 软件包是ar
归档程序,而
cpio
常用于初始 ramdisk。) tar
是或经常与压缩工具(例如compress
(.Z)、gzip
(.gz)、
bzip2
(.bz2) 和xz
(.xz))结合使用,从最旧到最新,并且并非巧合地从最差到最好的压缩。
制作tar
档案和压缩档案是两个截然不同的步骤:压缩器对tar
文件格式一无所知。这意味着从压缩档案中提取单个文件tar
需要解压所有前面的文件。这通常称为“固实”档案。
同样,由于 tar 是一种“流式”格式(需要在管道中使用),因此 tar 存档中没有全局索引,并且列出 tar 存档的内容与提取它一样昂贵。
相比之下,Zip、RAR 和 7-zip(现代 Windows 平台上最流行的归档程序)通常会单独压缩每个文件,并且即使有也只是稍微压缩元数据。这样可以方便地列出存档中的文件并提取单个文件,但这意味着无法利用同一存档中多个文件之间的冗余来增加压缩率。虽然通常压缩已压缩的文件不会进一步减小文件大小,但有时您可能会看到 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 文件,因为它们关系密切。
最后:如果您要存档数据用于短期存储以外的任何目的,则应该选择一些开源且最好是广泛使用的数据,以尽量减少以后的麻烦。
答案4
对于特别大的文件,您可以使用rzip
。它首先查看 900 MB 大块内的冗余数据,对其进行编码,然后将数据交给 bzip2(实际上并非如此,但使用相同的算法)。
xz
效果如何?比、lzma
或快得多bzip2
,而且根据我的经验,它的压缩率可与 相媲美lzma
。不过,它占用大量内存。