Kaz*_*lfe 13 compression zip tar 7zip
我一直使用 TAR 和 ZIP 进行压缩,但最近我听说了*.Z
压缩算法。这给我带来了一个问题:
对于所有这些压缩系统,哪一个最适合一般用途和压缩?
运行一些测试,我发现tar
,正如我发现的那样,并没有真正压缩(除非明确指定)。意思是,与其他压缩方法相比,它有什么好处?
我已经知道 ZIP 是使用最广泛的压缩系统,但我应该使用它而不是*.Z
, *.7z
, .tar
, 或.tar.<insert ending here>
吗?
帖子摘要:
*.tar
, *.Z
, *.7z
, .tar
, 还是.tar.<insert ending here>
以获得最佳压缩效果?*.tar
不压缩,我们为什么要使用它?编辑:并非所有算法都允许存储 Linux 权限(从我学到的)。哪个可以,是否有某种黑客(或脚本)可以用来存储权限?
psu*_*usi 18
tar
代表磁带存档。它所做的只是将文件及其元数据(权限、所有权等)打包成一个字节流,这些字节流可以存储在磁带驱动器(或文件)上并在以后恢复。压缩是一个完全独立的事情,如果需要的话,您过去必须通过外部实用程序将输出通过管道进行压缩。GNU tar 很好地添加了开关,告诉它通过适当的实用程序作为快捷方式自动过滤输出。
Zip 和 7z 将归档和压缩结合到它们自己的容器格式中,它们旨在在 DOS/Windows 系统上打包文件,因此它们不存储 unix 权限和所有权。因此,如果您想存储正确备份的权限,则需要坚持使用 tar。如果您计划与 Windows 用户交换文件,那么 zip 或 7z 是不错的选择。zip 和 7zip 使用的实际压缩算法可以与 tar 一起使用gzip
,lzma
分别通过 uzing和。
lzma(又名 *.xz)具有最佳压缩比之一,并且解压速度非常快,使其成为当今的首选。然而,它确实需要大量的 ram 和 cpu 时间来压缩。可敬的gzip
压缩速度要快得多,因此如果您不想花费那么多 CPU 时间,可以使用它。它还有一个更快的变体,称为 lzop。 bzip2
仍然相当受欢迎,因为它在 7zip/lzma 出现之前的一段时间内在很大程度上取代了 gzip,因为它获得了更好的压缩率,但由于 7z/lzma 的解压速度更快,并且获得了更好的压缩率,因此如今已不再受欢迎。该compress
实用程序通常将文件命名为 *.Z,它很古老且早已被遗忘。
zip 和 tar 之间的其他重要区别之一是 zip 将数据压缩为小块,而当您压缩 tar 文件时,您会一次压缩整个内容。后者提供了更好的压缩率,但为了在存档末尾提取单个文件,您必须解压缩整个文件才能找到它。因此,zip 格式更适合从大型存档中提取一个或两个文件。7z 并dar
允许您选择压缩整个事物(称为“固体”模式)或小块,以便于零碎提取。
算法的细节在这里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
今天仍然流行的其他基本原因是:
效率:使用tar
管道通过压缩程序gzip
更有效,因为它避免了创建中间文件。
tar
带有各种花里胡哨的功能,在其悠久的历史中设计的功能使其对 *nix 备份特别有用(想想权限、文件所有权、将数据直接传输到 STDOUT 和通过 SSH 链接的能力...... )
惯性。我们习惯了tar
。可以安全地假设它可以在您可能碰巧使用的任何 *nix 上使用,这使得它对于源代码 tarball 非常便携和方便。
1这绝对是真的,与我对它们的了解不够,无法解释这一事实无关:)