压缩文件夹,但不压缩特定文件类型,而是将它们包含在 gz 文件中

压缩文件夹,但不压缩特定文件类型,而是将它们包含在 gz 文件中

我使用 tar 和 pigz 来压缩文件夹并保存备份。此文件夹的大小约为 250 GB 或更多。该文件夹包含各种内容,包括许多不同子文件夹中的大量文本和日志文件、ISO 和 zip 文件。完全压缩此文件夹大约需要 1 小时(有时甚至更长)。目前我在脚本中使用它。

tar -cf - <data_folder> | pigz -1 > <output_file>.tar.$

我想通过排除 ISO 和 zip 文件的压缩来减少压缩时间。我希望它们(ISO 和 zip 文件)包含在 gzip 文件中(未压缩)。

我的问题是这样的:是否可以根据类型有选择地压缩文件,并且仍然在 gzip 输出中包含未压缩的文件?如何尝试这个?

答案1

不,你不能。至少不是直接的。

tar不做任何压缩。它仅读取(虚拟)文件系统的一部分,并从中生成一个内聚流。然后,该流通常会传递到压缩工具/库,例如gzip/libz。压缩部分看不到甚至不知道单个文件。它只是压缩由 生成的流tar。因此,您无法将选择性压缩添加到当前方法中。

您可以做的是通过单独压缩每个文件然后将其添加到 tar 存档中来逐步构建 tar 存档。通过这样做,您可以选择将(例如)未压缩的 iso 映像添加到存档中。但请注意,tar 存档本身不会被压缩。因此,解压后,您还必须在适当的情况下单独解压缩每个文件。

压缩 isos 和 zip 文件实际上损失了多少时间?看到tar | pigz > <file>流处理我猜你不会浪费那么多时间。有块写入磁盘,同时正在压缩下一个块,同时正在构建流。它是同时发生的。

也许你可以优化你的策略:

您可以将所有 iso 和 zip 文件放入专用目录中,然后分三个步骤构建存档:tar 并压缩其余部分、添加 iso 目录、添加 zip 目录。生成的存档仍然需要一个漫长的提取过程,即解开外部存档,然后解压缩并解开内部存档。然而,这比解压缩每个单独的文件更可行。

或者您调整命令:它是否必须是文件系统的 tar 存档,或者您可以使用它dd来备份整个分区吗?备份整个分区的优点是可以从磁盘连续读取,这可能比使用文件系统更快。我确信您可以调整pigz以处理更大的块,如果 iso 和 zip 文件是您的问题,这应该会加快您的速度。此外,您可以mbuffer在将结果写入磁盘之前添加一些缓冲(例如),以进一步优化媒体访问。

相关内容