重新压缩文件而不创建临时文件


0

也许最好只是从用例开始。
我有一个大的zip文件,里面充满了许多文件,我怀疑它最初是在低压缩级别下压缩的。

我想从该文件创建一个新的zip文件(或者不是新文件,希望是就地放置),以确保其压缩良好(-9)而不先将其解压缩到磁盘上(由于各种原因,例如大小和被挂载的NFS)。所以虽然我可以做

mkdir tmp/ && unzip -d tmp/ A.zip && cd tmp/ && zip -r -9 ../B.zip *; rm -rf tmp/ A.zip

这会(临时)创建大量数据(解压缩的文件B.zipA.zip删除之前就存在)。
我真的想要一些类似的东西:

rezip -9 A.zip

或者,解决B.zip

unzip -<output to stdout> A.zip | zip -9 B.zip && rm -f A.zip

但是我意识到,由于管道将用于多个文件,文件名之类的东西将丢失,因此这实际上是不可能的。

所以,我想知道是否有一种方法可以在每个文件上执行一些代码,例如 find -exec <command>

unzip A.zip -exec zip -r B.zip && rm -f A.zip

但是同样,不确定这是如何工作的,或者不确定是否通过unzip/来促进zip,是否存在执行该命令的命令。

我已经将我目前仍在使用的单个文件的临时解决方法作为答案,因为它可能会对某人有所帮助,尽管这是无法接受的,因为它无法回答不允许使用临时文件的问题

Answers:


0

我找到了更好的解决方案:

unzip -p original.zip | zip -9 new.zip -

unzip -p告诉unzip将输出发送到stdout。zip命令的最后一个破折号告诉它从stdin读取。

如果确实需要,仍需要将new.zip重命名为original.zip。


1
仅适用于使用zip算法压缩的单个文件,不适用于zip下的存档。尝试echo bob > bob.txt; echo steve > steve.txt; zip original {bob,steve}.txt; unzip -l original.zip显示两个文件。现在,使用您的解决方案,unzip -p original.zip | zip -9 new.zip -; unzip -l new.zip仅重新打包一个名为“-”的“文件”
Hashbrown

0

已经有一段时间了,但是这是您的操作方法。
适用于名称和子目录中带有空格的文件。

zipinfo -1 A.zip | while read filename
do
    unzip -p A.zip "$filename" | zip -9 A.zip -
    zip --delete A.zip "$filename"
    printf "@ -\n@=$filename\n" | zipnote -w A.zip
done

0

开源的Zip-Ada项目完全具有这种重新压缩工具。

  1. 获取/下载资源
  2. 使用命令构建gnatmake -P zipada(通过apt或yum获得GNAT)
  3. 您现在可以使用以下选项进行二进制重新压缩:

Usage: rezip [options] archive(s)[.zip]

Options:  -defl     : repack archive only with the Deflate
                    subformat (most compatible)
          -fast_dec : repack archive only with fast decompressing subformats
          -int      : use internal Zip-Ada algorithms only, no external call
          -touch    : set time stamps to now
          -lower    : set full file names to lower case
          -del_comm : delete comment
          -comp     : compare original and repacked archives (paranoid mode)
          -rs=n     : loop many times over a single compression approach
                        having randomization, and keep optimum when size is
                        stable after n attempts in a row

首先,我建议使用-defl-int选项(值得注意的是,-defl将使生成的Zip文件与诸如的旧工具兼容unzip)。

该命令将例如 ./rezip -int -defl -comp A.zip


看起来它们已经针对Windows进行了预编译,这非常适合他们,但是,如果您使用的是Linux,则使用标准工具
Hashbrown
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.