Linux 在不压缩的情况下确定 ZIP 大小

Linux 在不压缩的情况下确定 ZIP 大小

我想使用zip命令制作一个 ZIP 文件。 Zip 文件将包含大量目录,其中包含大量子目录、文件等。

有没有办法在磁盘上进行实际压缩之前计算 ZIP 文件的最终大小?

例如:计算最终 ZIP 文件大小以确定 ZIP 是否适合特定大小的容器(即使在 tmp 中我们也无法在磁盘上执行操作,因为如果它不适合,那么压缩将失败而不提供有关存档大小的信息)

答案1

来自zip 手册页:

流式输入和输出。 zip 还将接受单个破折号(“-”)作为 zip 文件名,在这种情况下,它将把 zip 文件写入标准输出,从而允许将输出通过管道传输到另一个程序。

所以:

$ zip -r - foo | wc -c

将告诉您目录 foo 的压缩大小(以字节为单位)。

7z 无法写入 zip 文件的标准输出。

另一种选择是创建一个内存磁盘并对其进行压缩。

答案2

您可以压缩到 StdOut 并计算字节数,但 AFAIKzip不会压缩到 stdout(7z另一个可以生成 ZIP 格式的实用程序也不会)(*)。

在 Linux 上,如果未指定输出文件,您通常会生成 .tar.gz 文件,并将实用程序输出到 stdout:

# compute size
outputSize=$(tar -cz the_directories | wc -c)
# create file
tar -czf some.tar.gz the_directories

请注意,在任何情况下,您都会进行两次压缩,如果不执行转换,则无法真正预测输出大小。

(*) 可能是因为您无法在没有看到结尾的情况下解码 ZIP 文件。

答案3

焦油CF  >(厕所-c  <文件名参数>;睡觉 1
不是写入文件,而是 tar写入wc -c命令的管道,该命令将报告写入的字节数。 (包括tar进行压缩所需的任何选项。)这使用了 bash 的“进程替换”功能。使用 是sleep 1因为,如果没有它,您的 shell 将在命令完成时发出下一个 shell 提示符tar,并且不会等待wc命令完成。

如果您没有 bash,您可能可以使用命名管道完成同样的事情。

相关内容