Unix

從 STDIN 更新 zip 存檔中的文件

  • January 7, 2010

我想更新/刷新 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 文件。

引用自:https://serverfault.com/questions/100354