Назад | Перейти на главную страницу

Обновление файла в zip-архиве из STDIN

Я хочу обновить / освежить файл в 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

Тогда вам не нужно беспокоиться о том, чтобы делать странные вращения, чтобы вернуть все обратно в

В ответ на ваш комментарий я могу придумать только два предложения:

а) Запишите файл в случайный временный каталог /tmp/<random_number>/meta.xml тогда сделай zip sample.odt -u /tmp/<random_number>/meta.xml

б) Спросите в Stack overflow, есть ли программный способ манипулировать вашим zip-файлом.

В zip man-страница описывает, как можно использовать одиночное тире для представления STDIN или STDOUT в командной строке, поэтому zip можно использовать в трубопроводе.

Искать Потоковый ввод и вывод на странице руководства.

НО, поскольку вы используете STDIN и не указав имя файла с помощью этого метода, он не будет работать так, как вы хотели бы, с zip-архивами с несколькими файлами.

Как упоминание о gunzip на странице руководства предполагается, что он предназначен для архивов, содержащих отдельные файлы.

Таким же образом gzip filename производит filename.gz, zip может создать filename.zip за исключением того, что zip требует, чтобы вы явно указали zip-файл.

ЗДЕСЬ соответствующий новый пост на SO. Я чуть не упал со стула, когда увидел это.