我想使用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,您可能可以使用命名管道完成同样的事情。