我想用stdin的内容更新/清新zip档案中的档案。 到目前为止,我还没有find一种方法来告诉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文件,因为在我的实际情况下,初始提取不会被redirect到一个文件。 而不是在后台队列中进行文本处理的数据库。 然后按要求将其重新input到文档中。
有没有一个原因,你不能这样做:
unzip -p sample.odt meta.xml #modify meta.xml zip sample.odt -u meta.xml rm meta.xml
那么你不必担心会发生奇怪的旋转,
回应你的评论,我能想到的唯一两个build议是
a)将文件写入一个随机临时目录/tmp/<random_number>/meta.xml然后执行zip sample.odt -u /tmp/<random_number>/meta.xml
b)询问堆栈溢出是否有程序化的方式来操作你的zip文件。
zip手册页描述了如何使用单个短划线在命令行中表示STDIN或STDOUT,因此可以在pipe道中使用zip 。
在手册页中查找streaminput和输出 。
但是因为你使用STDIN而没有用这个方法指定一个文件名,所以你不会像使用多文件zip压缩文件一样工作。
正如man page中提到的gunzip所暗示的那样,它意味着包含单个文件的存档。
以同样的方式gzip filename产生filename.gz, zip可以产生filename.zip, 除了zip需要你显式地命名zip文件 。
这是SO的相关新职位。 当我看到这个时,我差点从椅子上掉下来。