Unix
從 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 文件中,因為在我的實際情況下,初始提取永遠不會被重定向到文件。取而代之的是數據庫,它在後台隊列中進行一些文本處理。然後根據需要將其替換回文件中。
您是否有理由不能這樣做:
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) 詢問堆棧溢出是否有程式方式來操作您的 zip 文件。