我想使用 的内容更新/刷新 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 上的相关新帖子。看到这个时我差点从椅子上摔下来。