我正在给 /home 涂上柏油,并通过 bzip2 通过管道传输它。但是,我有很多已经压缩的文件(.jpg、.mp4、.mkv、.webm 等),bzip2 不应该尝试压缩这些文件。
是否有足够智能的 CLI 压缩器(通过 libmagic 或用户枚举扩展)不会尝试备份不可压缩或最低限度压缩的文件?
几年前有人问过类似的问题,但不知道此后是否有任何更新。 我可以命令 7z 在使用子目录压缩目录时跳过特定文件的压缩(但不包含)吗?
答案1
按照您执行此操作的方式(压缩文件),.tar
答案肯定是否定的。
无论您使用什么来压缩.tar
文件,它都不知道文件的内容,它只看到一个二进制流,并且该流的某些部分是否不可压缩或最小可压缩,这是无法得知的。不要对tar
执行压缩的命令的选项感到困惑,tar --create --xz --file some.tar file1
就像了解流内容一样“愚蠢” tar --create file1 | xz > some.tar
。
您可以做多种事情:
- 您可以切换到某种容器格式,而不是
.tar
允许您进行单独压缩,但如果一个目录中有大量具有相似模式的小文件(因为它们是单独压缩的),则这是不利的。 zip 格式是一个可行的示例。 - 如果合适的话,您可以在将文件放入 tar 文件之前对其进行压缩。这可以通过例如 python
tarfile
和bzip2
模块透明地完成这也具有第 1 点的缺点。并且不能直接从 tar 文件中提取,因为某些文件将被压缩,可能不需要解压缩(因为在备份之前已经压缩了) )。 - 按原样使用 tar 并接受这种情况发生的事实,并选择一个不太高的压缩
gzip
//bzip2
这样xz
他们就不会太努力地压缩流,从而不会浪费时间尝试获得另一个 0.5% 的压缩,这不是将要发生。
您可能想查看并行压缩的结果xz
(不是特定于 tar 文件),以查看尝试加速的一些结果xz
,如我在我的网站上发布的那样博客
答案2
这LZ4算法可能是一个选择。
它检查块的开头是否可压缩,如果比率较低,则将其存储为未压缩的。这成功地防止了对已压缩文件的压缩,而无需指定其名称。
与您提到的算法相比,整体压缩率较低。但另一方面,LZ4 却非常快。您可以轻松达到数百 MiB/s 的压缩和 GiB/s 的解压速度。
例子:
# Compression (creates <inputfile>.lz4)
lz4c <inputfile>
# Decompression
lz4c -d <inputfile>
# Use with tar
tar cf - <directory> | lz4c > <directory>.tar.lz4
# Use with GNU tar
tar cf <directory>.tar.lz4 -I lz4c <directory>