我有一个用例,我需要将一堆文件打包成一个。以上所有命令的作用都是相同的。我知道gzip
压缩我的文件,但可以说空间对我来说根本不是问题,那么在这种情况下我应该选择哪一个?
现在有人会说,使用压缩在网络上传输文件时可以节省一些时间,但解压缩和解压缩可以补偿我在传输中节省的时间。所以基本上我无法选择和决定选择上述哪些工具以及何时选择?
答案1
我有一个用例,我需要将一堆文件打包成一个
啊,你需要一个档案文件数
以上所有命令的作用都是一样的。
一点也不!有些是归档器,有些是压缩器,有些是解压缩器,有些是组合。
ar
:非常古老,用例是非常具体的。很确定你永远不想使用ar
自己。gzip
/gunzip
:不是存档器。可以获取单个数据流并对其进行压缩(或解压缩,在 的情况下gunzip
)。你可以用这个一起与存档器。 Gzip 非常古老、缓慢且低效,有一些替代方案可以实现更高的压缩率或更高的速度,或者它们的任何混合(例如zstd
,,lz4
)tar
: 短缺磁带归档器;一个非常常见的归档程序,您也可以用它来压缩内容。例如:
tar cf archive.tar file1 file2 file3
创建一个未压缩的包含 file1、file2 和 file3 的存档。但是,将z
选项添加到c
reate 命令中(我知道 的tar
语法很糟糕):
tar czf archive.tar.gz file1 file2 file3
将在内部tar
使用gzip
并创建一个已压缩的 tar 存档。
您还可以将结果通过您选择的任何压缩器进行管道传输以获得压缩档案,例如
tar cf - file1 file2 file3 | gzip > archive.tar.gz # or
tar cf - file1 file2 file3 | zstd > archive.tar.zst # or
tar cf - file1 file2 file3 | lz4 - archive.tar.xz # or
tar cf - file1 file2 file3 | xz > archive.tar.xz
你明白了。
尽管很常见tar
,但它是一个非常古老的程序和格式,并且还有很多不足之处。但它确实正确处理 Linux 文件所有权、权限、链接、特殊文件……
zip
是一个压缩存档器。在 Windows 上也能很好地工作,但不能处理文件权限。因此,不可用于备份!7z
类似于 zip,一个压缩归档程序,无法处理用户和权限信息。因此,不可用于备份!mksquashfs
是一种归档程序,用于非常整齐地打包的归档文件,也可以像普通文件系统一样使用。它可以根据要求使用现代的非常快或非常强的压缩。
现在有人会说,使用压缩在网络上传输文件时可以节省一些时间,但解压缩和解压缩可以补偿我在传输中节省的时间。
那些人是对的!如果您使用现代的、速度优化的压缩,您会快点与通过解压缩从 SSD 读取或写入相比。而且比您的网络快得多(除非您正在考虑数据中心级网络)。
因此,如果速度如果您担心的话,请使用使用快速压缩机的东西。如前所述,gzip
可能不是 2023 年的压缩机选择,所以
tar cf - srces/ | zstd -1 > archive.tar.zst
在我使用源代码和二进制文件混合的测试中,实现了大约 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 :)
所以:
- 需要快速归档文件,以便将它们发送给可能没有与您相同软件的其他人吗?
tar cv - files… | zstd -4 -T0 > archive.tar.zst
就是你想要的 - 需要归档文件,但进行严格压缩,以便将它们发送给可能没有与您相同的软件的其他人?
tar cv - files… | zstd -13 -T0 > archive.tar.zst
速度较慢,但已经提供了非常高的压缩比。 - 需要存档文件,想稍后阅读它们,而无需取消存档?
mksquashfs files… archive.squashfs -comp=zstd
;添加-Xcompression-level 4
到末尾以获得更高的速度,但会牺牲大小。
生成的archive.tar.zst
文件可以直接使用现代 GNU tar 解压缩tar xf archive.tar.zst
;可以像 DVD 一样archive.squashfs
直接安装udisksctl loop-setup -f archive.squashfs
并使用(即,您可以直接浏览其上的文件),也可以使用unsquashfs archive.squashfs