Я хочу обновить / освежить файл в 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. Я чуть не упал со стула, когда увидел это.