使用列表参数估计压缩文件大小

使用列表参数估计压缩文件大小

我目前正在压缩目录中以下格式的文件列表:

tar -cvjf test_1.tar.gz -T test_1.lst --无递归

上述命令将仅压缩列表中提到的文件。我这样做是因为此列表的生成方式使其适合 DVD。但是,在压缩过程中,压缩率会降低估计的文件大小,并且 DVD 中会剩余充足的空间。这有点像背包算法。

我想估计压缩文件的大小并将更多文件添加到列表中。我发现可以使用以下命令来估计文件大小:

tar -cjf - 文件夹/| wc -c

此命令不接受列表参数。有没有办法估算压缩文件的大小?我也在研究诸如 perl 脚本等选项。

编辑:

我认为我应该提供更多信息,因为我进行了很多网络搜索。我偶然发现了一个 perl 脚本(关联)这类似于背包算法。

上述脚本目前存在的问题是,它以原始状态分割文件。当我分割文件后压缩文件时,可能会添加更多文件,我认为这是低效的。

有两种方法可以解决效率低下的问题:

a) 使用脚本压缩单个文件并将其保存在目录中。压缩文件可以提供最佳估计。我可以使用压缩文件的文件夹生成脚本,并将其用于未压缩的文件。

b) 检查压缩文件的大小是否小于要求的大小。如果是,我应该继续添加文件,直到满足要求。但是,向压缩文件中添加新文件本身就是一个优化问题。

答案1

编辑2:

我重新阅读了你的问题,找到了一种解释它的新方法。使用类似bzip2 -k $file | wc -con every file 的命令,很容易找到压缩后文件的大小。然而,这并不能解决你的问题,因为你感兴趣的不是每个压缩文件的大小,而是包含所有文件的压缩包的压缩大小(以及如果添加特定文件,它会增加多少)。压缩后的大小差异并不线性但事实上是不可预测的,因此一个因素对于第二个因素来说是一个很差的预测因素。

一个例子是两个相同的 10 MiB 文件,它们分别压缩到 1 MiB,而包含这两个文件的 tarball 也压缩到 1 MiB。

原始答案

我相信常见的解决方案是将压缩数据拆分为split,这意味着如果您想从其中任何一个磁盘恢复文件,则需要所有可用的结果磁盘。我认为它tar有一个内置的拆分机制,但它只适用于未压缩的数据量,这会导致压缩和非同质文件的结果不佳。

如果您可以进行手动干预,则可以使用另一种解决方案(远非完美),并且可能就足够了。如果您的文件与所需的卷大小相比很大,则效果最佳

我假设您有一个目标卷大小(以 MiB 为单位)。在示例中,我使用了 700 MiB。

如果你跑

tout="/tmp/09b00c50a9625deeb1089b3c4358c5e5" #or something else
csize="7" # in MiB
mkfifo "$tout"
tar -cvj ~/ 2>"$tout" | dd bs=1M count="$csize" of=/dev/null iflag=fullblock 2>/dev/null &
tail -20 "$tout" | xargs -n 1 ls -ld
rm "$tout"

tar将打印出它尝试压缩到管道的所有文件,直到 dd 收到 700 MiB 的压缩数据。从 fifotail读取尝试压缩的最后 20 个文件。tar

打印的最后一个文件(至少)无法放入您的卷大小中。由于和 中的缓存tarbzip2其他几个最后文件可能也放不下,因此您可能需要尝试跳过多少个文件。如果所有文件都非常小,您可能需要tail打印出 20 个以上文件,才能看到哪个文件超出了限制。

编辑:

您甚至可以将文件名直接写入文件列表(使用合适的过滤器删除目录)并在文本编辑器中删除最后几行。

相关内容