从 STDIN 更新 zip 存档中的文件

从 STDIN 更新 zip 存档中的文件

我想使用 的内容更新/刷新 zip 存档中的文件stdin。到目前为止,我还没有找到一种方法来告诉zip命令 的内容stdin对应于特定文件。

例如(最后一行是我期望它如何工作但它不会对 zip 文件进行任何更改):

~/D/tmp ♪ unzip -l sample.odt # an odt file is actually a zip file
Archive:  sample.odt
  Length     Date   Time    Name
 --------    ----   ----    ----
       39  01-06-10 00:46   mimetype
        0  01-06-10 00:46   Configurations2/statusbar/
        0  01-06-10 00:46   Configurations2/accelerator/current.xml
        0  01-06-10 00:46   Configurations2/floater/
        0  01-06-10 00:46   Configurations2/popupmenu/
        0  01-06-10 00:46   Configurations2/progressbar/
        0  01-06-10 00:46   Configurations2/menubar/
        0  01-06-10 00:46   Configurations2/toolbar/
        0  01-06-10 00:46   Configurations2/images/Bitmaps/
     3374  01-06-10 00:46   content.xml
    11837  01-06-10 00:46   styles.xml
      957  01-06-10 00:46   meta.xml
     1060  01-06-10 00:46   Thumbnails/thumbnail.png
     8086  01-06-10 00:46   settings.xml
     1889  01-06-10 00:46   META-INF/manifest.xml
 --------                   -------
    27242                   15 files
~/D/tmp ♪ unzip -p sample.odt meta.xml > tmp.xml
~/D/tmp ♪ # modify tmp.xml somehow
~/D/tmp ♪ cat tmp.xml | zip sample.odt -u meta.xml

编辑(摘自我下面的评论):我无法通过引用新版本直接将文件加载到 zip 文件中,因为在我的实际情况中,初始提取永远不会重定向到文件。而是重定向到数据库,在后台队列中进行一些文本处理。然后根据需要将其替换回文档中。

答案1

你不能这样做的原因是什么:

unzip -p sample.odt meta.xml
#modify meta.xml
zip sample.odt -u meta.xml
rm meta.xml

然后你就不必担心做奇怪的旋转来将所有东西重新输入

针对你的评论,我能想到的唯一两条建议是

a) 将文件写入随机临时目录/tmp/<random_number>/meta.xml,然后执行zip sample.odt -u /tmp/<random_number>/meta.xml

b) 在 Stack overflow 上询问是否有编程方式来操作你的 zip 文件。

答案2

手册zip页描述了如何在命令行中使用单个破折号来表示 STDIN 或 STDOUT,以便zip可以在管道中使用。

寻找流式输入和输出在手册页中。

但是由于你使用的是 STDIN 和不是使用此方法指定文件名,它将无法按照您希望的方式处理多文件 zip 档案。

正如gunzip手册页中提到的那样,它适用于包含单个文件的档案。

用同样的方式gzip filename生成filename.gz,zip就可以生成filename.zip除了 zip 需要你明确命名 zip 文件

以下是SO 上的相关新帖子。看到这个时我差点从椅子上摔下来。

相关内容