不同的“压缩”系统有什么区别?

Kaz*_*lfe 13 compression zip tar 7zip

我一直使用 TAR 和 ZIP 进行压缩,但最近我听说了*.Z压缩算法。这给我带来了一个问题:

对于所有这些压缩系统,哪一个最适合一般用途和压缩?

运行一些测试,我发现tar,正如我发现的那样,并没有真正压缩(除非明确指定)。意思是,与其他压缩方法相比,它有什么好处?

我已经知道 ZIP 是使用最广泛的压缩系统,但我应该使用它而不是*.Z, *.7z, .tar, 或.tar.<insert ending here>吗?

帖子摘要:

  1. 我应该使用*.tar, *.Z, *.7z, .tar, 还是.tar.<insert ending here>以获得最佳压缩效果?
  2. 如果plain*.tar不压缩,我们为什么要使用它?

编辑:并非所有算法都允许存储 Linux 权限(从我学到的)。哪个可以,是否有某种黑客(或脚本)可以用来存储权限?

psu*_*usi 18

tar代表磁带存档。它所做的只是将文件及其元数据(权限、所有权等)打包成一个字节流,这些字节流可以存储在磁带驱动器(或文件)上并在以后恢复。压缩是一个完全独立的事情,如果需要的话,您过去必须通过外部实用程序将输出通过管道进行压缩。GNU tar 很好地添加了开关,告诉它通过适当的实用程序作为快捷方式自动过滤输出。

Zip 和 7z 将归档和压缩结合到它们自己的容器格式中,它们旨在在 DOS/Windows 系统上打包文件,因此它们不存储 unix 权限和所有权。因此,如果您想存储正确备份的权限,则需要坚持使用 tar。如果您计划与 Windows 用户交换文件,那么 zip 或 7z 是不错的选择。zip 和 7zip 使用的实际压缩算法可以与 tar 一起使用gziplzma分别通过 uzing和。

lzma(又名 *.xz)具有最佳压缩比之一,并且解压速度非常快,使其成为当今的首选。然而,它确实需要大量的 ram 和 cpu 时间来压缩。可敬的gzip压缩速度要快得多,因此如果您不想花费那么多 CPU 时间,可以使用它。它还有一个更快的变体,称为 lzop。 bzip2仍然相当受欢迎,因为它在 7zip/lzma 出现之前的一段时间内在很大程度上取代了 gzip,因为它获得了更好的压缩率,但由于 7z/lzma 的解压速度更快,并且获得了更好的压缩率,因此如今已不再受欢迎。该compress实用程序通常将文件命名为 *.Z,它很古老且早已被遗忘。

zip 和 tar 之间的其他重要区别之一是 zip 将数据压缩为小块,而当您压缩 tar 文件时,您会一次压缩整个内容。后者提供了更好的压缩率,但为了在存档末尾提取单个文件,您必须解压缩整个文件才能找到它。因此,zip 格式更适合从大型存档中提取一个或两个文件。7z 并dar允许您选择压缩整个事物(称为“固体”模式)或小块,以便于零碎提取。


ter*_*don 9

算法的细节在这里1是题外话,因为它们在任何方面都不特定于 Linux,更不用说 Ubuntu。但是,您会在这里找到一些不错的信息。

现在tar,正如您所说,tar现在不是,也从来都不是压缩程序。相反,它是一个存档器;它的主要目的是把许多小文件做成一个大文件。从历史上看,这是为了便于在磁带驱动器上进行存储,因此得名:Tape ARchive。

今天,使用的主要原因tar是减少系统上的文件数量。Unix 文件系统上的每个文件都占用一个inode,您拥有的文件越多,可用的 inode 就越少,并且当您用完 inode 时,您将无法再创建新文件。简而言之,与存储在单个 tar 存档中的相同文件相比,存储为数千个文件的相同数量的数据将占用更多的硬盘驱动器。

为了说明这一点,由于在评论中对此存在争议,因此在我的 68G/分区上,我有以下总和已使用的 inode 数量(请记住,inode 数量取决于文件系统类型和分区大小):

Inode count:              393216
Free inodes:              171421
Run Code Online (Sandbox Code Playgroud)

如果我现在继续尝试创建比 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
Run Code Online (Sandbox Code Playgroud)

没有空间?但我有很多空间:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       5,8G  4,3G  1,2G  79% /
Run Code Online (Sandbox Code Playgroud)

正如您在上面看到的,创建几十万个空文件会迅速耗尽我的 inode,我无法再创建新的 inode。如果我是tar这些,我将能够再次开始创建文件。

更少的文件也大大加快了文件系统 I/O,尤其是在 NFS 挂载的文件系统上。当一个项目完成时,我总是 tar 我的旧工作目录,因为我拥有的文件越少,这样的程序find就会运行得越快。

超级用户上有一个很好的答案,其中详细介绍了更多细节,但除上述之外,tar今天仍然流行的其他基本原因是:

  1. 效率:使用tar管道通过压缩程序gzip更有效,因为它避免了创建中间文件。

  2. tar 带有各种花里胡哨的功能,在其悠久的历史中设计的功能使其对 *nix 备份特别有用(想想权限、文件所有权、将数据直接传输到 STDOUT 和通过 SSH 链接的能力...... )

  3. 惯性。我们习惯了tar。可以安全地假设它可以在您可能碰巧使用的任何 *nix 上使用,这使得它对于源代码 tarball 非常便携和方便。


1这绝对是真的,与我对它们的了解不够,无法解释这一事实无关:)

  • 我的电脑(过去)有超过 10,000,000 个文件,这并不是太疯狂。我从不使用 `tar` 来“减少文件数量”,因为坦率地说,大多数文件系统并不关心,而且无论如何它都不是最佳选择,因为 `tar` 不支持轻松随机访问文件。相反,主要用途(对我和我认为对大多数人而言)是以简单的方式与其他人共享文件(例如源代码)。 (3认同)