如何在不使用临时目录的情况下重新打包Zip文件?

3

我有很多需要重新打包/压缩的zip文件,以便解决MediaWiki 0.1.18中的一个错误。

我可以使用以下方法完成此操作:

#!/bin/bash

for f in *zip; do
   cd tmp
   rm -rf *
   unzip ../"$f"
   zip -r ../"$f" *
   cd ..
done

但是有没有一种方法可以使用管道或者zip选项来实现这个功能?

据我所知,man zip 没有提到这个问题,但我可以使用临时目录重新打包文件,但我真的想避免这种情况。 - Sandra Schlichting
4个回答

4
gzip -d -c old.gz | gzip >new.gz

我手头有真正的.zip文件,但遗憾的是不是.gz - Sandra Schlichting
你要打开哪个程序来使用.zip文件呢?zipunzip安装了吗?还是7zip? - Konerak
是的,zip、unzip和7z都在那里。 - Sandra Schlichting
那么我建议您使用zip和unzip而不是gzip和gzip -d :] zip还支持一个-c参数,将输出重定向到STDOUT,然后将其管道传输到STDIN。将其放入您的bash脚本中并添加文件名。 - Konerak
1
无法将zip的输出作为管道传输,因为zip不包含单个流,而是文件和基本文件系统。请将其视为tar而非gzip。 - thomasrutter
显示剩余3条评论

3

有一个叫做AdvanceCOMP的工具可以完全满足您的需求。它可以在不中间解压到磁盘的情况下重新压缩ZIP和GZ文件(以及一些其他文件)。我相信使用的机制是将数据解压缩并重新压缩,但这不需要将文件写入磁盘或重新生成元数据。


无法在backup.zip上运行advzip - 显示CRC错误。Zip文件测试正常。也许这个实用程序是专门针对MAME的? - Sun
Advzip 对我来说运行得非常好。我无法确定导致你遇到 CRC 错误的原因。 - thomasrutter

1

你无法这样做。如果您将一些位发送到zip,它就没有办法知道一个文件何时结束,另一个文件何时开始。

实际上,您可以编写自己的程序来完成此任务,但根据您的描述,似乎有些过度设计。此外,您没有说明要修复的错误具体是什么,因此无法建议其他解决方法。


请展示那个“简单”的脚本。对我来说,最简单的方法是使用一些脚本语言和一些压缩库来执行它,而不使用临时文件/目录。我也看不到任何从stdin读取数据的zip选项。但我认为可以使用<(command) bash语法来创建一些东西,但处理一个文件会很慢。而且代码会非常丑陋。 - akostadinov
1
回显“这将被压缩”| tee x | zip > x.zip; unzip -p x.zip> y; diff x y; - x.zip 将是 x 的压缩版本,x 和 y 将相等。实际上,zip 命令可以很好地处理标准输入、标准输出和管道。 - Konerak
顺便说一下,令人悲伤的是,一个非答案有6个赞,而揭示不愉快真相的回答却只有0个... - akostadinov
亲爱的,你的回答以“你不能”开头。显然,如果你可以从STDIN压缩并输出到STDOUT,那么你是可以的。如果你有多个文件,你确实需要一个解决方案来处理文件名,比如find-execdir或bash脚本。 - Konerak
问题非常明确,Sandra想要重新压缩随机存档文件。这不是关于在stdin上压缩一个文件的问题。此外,您的示例以一些数据开头。您需要从一个zip文件开始,并以具有相同内容的zip文件结束。您没有(也不能)展示出来。因此,我的答案是正确的。你不能做到。我说,通过一些编程是可能的,但不会编写这样的程序。相反,您的答案是无用的,但获得了信用。你的答案错了-好的。你得到了信用-好的。但告诉别人答案更错误-对我来说不行。我就说到这里。 - akostadinov
显示剩余2条评论

1

有点晚了,但对于那些后来者可能会有帮助:

zipsplit -n 2147483648 可以在不解压缩的情况下重新打包zip文件,最多可以打包2GB。但由于此命令是用于拆分zip文件的,因此没有覆盖原始文件或指定输出文件的选项,只能指定输出目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接