ar、tar、gzip、zip 之间的区别以及我何时应该决定选择哪一个?

Him*_*man 4 tar zip archive gzip

我有一个用例,我需要将一堆文件打包成一个。以上所有命令的作用都是相同的。我知道gzip 压缩我的文件,但可以说空间对我来说根本不是问题,那么在这种情况下我应该选择哪一个?

现在有人会说,使用压缩在网络上传输文件时可以节省一些时间,但解压缩和解压缩可以补偿我在传输中节省的时间。所以基本上我无法选择和决定选择上述哪些工具以及何时选择?

Mar*_*ler 10

\n

我有一个用例,我需要将一堆文件打包成一个

\n
\n

啊,你需要一个文件存档

\n
\n

以上所有命令的作用都是相同的。

\n
\n

一点也不!有些是归档器,有些是压缩器,有些是解压缩器,有些是组合。

\n
    \n
  • ar:非常古老,用例非常具体。很确定你永远不想使用ar自己。
  • \n
  • gzip/ gunzip:不是存档器。可以获取单个数据流并对其进行压缩(或解压缩,在 的情况下gunzip)。您可以将其与存档器一起使用。Gzip 非常古老、缓慢且低效,有一些替代方案可以实现更高的压缩率或更高的速度,或者它们的任何混合(例如zstd,,lz4
  • \n
  • tar:磁带归档器的缩写;一个非常常见的归档程序,您也可以用它来压缩内容。例如:
  • \n
\n
tar cf archive.tar file1 file2 file3\n
Run Code Online (Sandbox Code Playgroud)\n

创建包含 file1、file2 和 file3 的未压缩存档。但是,将z选项添加到create 命令中(我知道 的tar语法很糟糕):

\n
tar czf archive.tar.gz file1 file2 file3\n
Run Code Online (Sandbox Code Playgroud)\n

将在内部使用targzip创建一个已压缩的 tar 存档。
\n您还可以将结果通过您选择的任何压缩器进行管道传输以获得压缩档案,例如

\n
tar cf - file1 file2 file3 | gzip > archive.tar.gz # or\ntar cf - file1 file2 file3 | zstd > archive.tar.zst # or\ntar cf - file1 file2 file3 | lz4 - archive.tar.xz # or\ntar cf - file1 file2 file3 | xz > archive.tar.xz\n
Run Code Online (Sandbox Code Playgroud)\n

你明白了。
\n虽然很常见tar,但它是一个非常古老的程序和格式,并且还有很多不足之处。但它确实正确处理 Linux 文件所有权、权限、链接、特殊文件\xe2\x80\xa6

\n
    \n
  • zip是一个压缩存档器。在 Windows 上也能很好地工作,但不能处理文件权限。因此,不可用于备份!
  • \n
  • 7z就像zip,一个压缩归档器,它不能处理用户和权限信息。因此,不可用于备份!
  • \n
  • mksquashfs是一种归档程序,用于非常整齐地打包的归档文件,也可以像普通文件系统一样使用。它可以根据要求使用现代的非常快或非常强的压缩。
  • \n
\n
\n

现在有人会说,使用压缩在网络上传输文件时可以节省一些时间,但解压缩和解压缩可以补偿我在传输中节省的时间。

\n
\n

那些人是对的!如果您使用现代的、速度优化的压缩,您会更快通过解压缩从 SSD 读取或写入而且比您的网络快得多(除非您正在考虑数据中心级网络)。

\n

因此,如果您关心速度,请使用使用快速压缩机的设备。正如所说,gzip可能不是 2023 年的压缩机选择,所以

\n
tar cf - srces/ | zstd -1 > archive.tar.zst\n
Run Code Online (Sandbox Code Playgroud)\n

在我使用源代码和二进制文件混合的测试中,实现了大约 3 Gb/s 的存档速率(如果您计划通过网络进行传输,并认为压缩器将成为瓶颈)。原来的 4.97 GB 变成了 1.4 GB。使用-2代替-1会使结果再小 10%,并将速度降低至 2.5 Gb/s。这仍然比大多数 SATA SSD 的写入速度更快。这是单线程的。用于zstd -2 -T0充分利用所有 CPU 核心,我的简陋 PC 的速度为 6.5 Gb/s;zstd -4 -T0仍然为 2.5 Gb/s,因此超出了我的大多数网卡的性能,并且大小降至 1.2 GB :)

\n

所以:

\n
    \n
  • 需要快速归档文件,以便将它们发送给可能没有与您相同软件的其他人吗?tar cv - files\xe2\x80\xa6 | zstd -4 -T0 > archive.tar.zst就是你想要的
  • \n
  • 需要归档文件,但进行严格压缩,以便将它们发送给可能没有与您相同的软件的其他人?tar cv - files\xe2\x80\xa6 | zstd -13 -T0 > archive.tar.zst速度较慢,但​​已经提供了非常高的压缩比。
  • \n
  • 需要存档文件,想稍后阅读它们,而无需取消存档?mksquashfs files\xe2\x80\xa6 archive.squashfs -comp=zstd; 添加-Xcompression-level 4到末尾以获得更高的速度,但会牺牲大小。
  • \n
\n

生成的archive.tar.zst文件可以直接使用现代 GNU tar 解压缩tar xf archive.tar.zst;可以像 DVD 一样archive.squashfs直接安装并使用(即,您可以直接浏览其上的文件),也可以使用udisksctl loop-setup -f archive.squashfsunsquashfs archive.squashfs

\n