告诉 gzip/bzip2/7z/etc 不要压缩已经压缩的文件?

告诉 gzip/bzip2/7z/etc 不要压缩已经压缩的文件?

我正在给 /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

您可以做多种事情:

  1. 您可以切换到某种容器格式,而不是.tar允许您进行单独压缩,但如果一个目录中有大量具有相似模式的小文件(因为它们是单独压缩的),则这是不利的。 zip 格式是一个可行的示例。
  2. 如果合适的话,您可以在将文件放入 tar 文件之前对其进行压缩。这可以通过例如 pythontarfilebzip2模块透明地完成这也具有第 1 点的缺点。并且不能直接从 tar 文件中提取,因为某些文件将被压缩,可能不需要解压缩(因为在备份之前已经压缩了) )。
  3. 按原样使用 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>

相关内容