Как обновить один файл в zip-архиве - PullRequest
67 голосов
/ 26 января 2011

Можно ли заменить файл в zip-файле без разархивирования, удалив старый файл, добавив новый файл и заново разархивировав его?

Причина в том, что у меня действительно большой zip-файл, есть один xmlвнутри почтового файла, который мне иногда приходится обновлять.Распаковка почтового индекса и повторная архивация занимают много времени.Так что я хотел бы просто иметь возможность заменить один xml внутри zip через скрипт.У меня уже есть эта проверка на наличие обновлений в xml, которые у меня есть.

Так можно ли просто заменить один xml, не разархивируя и не разархивируя?но проблема в том, что скрипт на самом деле предназначен для телефона Android, а zip - это не команда, которую я могу использовать, к сожалению, извините, я не учел это.Я бы определенно использовал zip, если бы мог, но у меня есть только распаковка для droid, а затем в busybox есть tar, но tar не делает то, что мне нужно

Ответы [ 10 ]

62 голосов
/ 18 января 2013

Я обнаружил, что файл Linux zip громоздок для замены одного файла в zip-файле. Утилита jar из Java Development Kit может быть проще. Рассмотрим общую задачу обновления WEB/web.xml в файле JAR (который является просто файлом zip):

jar -uf path/to/myapp.jar -C path/to/dir WEB-INF/web.xml

Здесь path/to/dir - это путь к каталогу, содержащему каталог WEB-INF (который в свою очередь содержит web.xml).

51 голосов
/ 26 января 2011

С почтовый индекс (1) :

Если дано имя существующего zip-архива, zip заменит записи с одинаковыми именами в zip-архиве или добавит записи для новых имен.

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

35 голосов
/ 22 марта 2014

Попробуйте следующее:

zip [zipfile] [file to update] 

Пример:

$ zip test.zip test/test.txt
updating: test/test.txt (stored 0%)
13 голосов
/ 29 декабря 2013

Я знаю, что это старый вопрос, но я хотел сделать то же самое.Обновите файл в zip-архиве.И ни один из приведенных выше ответов действительно не помог мне.

Вот что я сделал.Создан временный каталог abc.Скопировал file.zip в abc и извлек файл в этом каталоге.Я отредактировал файл, который хотел отредактировать.Затем, находясь в abc, выполните следующую команду

user@host ~/temp/abc $ zip -u file.zip
updating: content/js/ (stored 0%)
updating: content/js/moduleConfig.js (deflated 69%)

-u, переключатель найдет измененные / новые файлы и добавит их в zip-архив.

10 голосов
/ 26 апреля 2016

Используйте флаг обновления: -u

Пример:

zip -ur existing.zip myFolder

Эта команда сжимает и добавляет myFolder (и его содержимое) к existing.zip.


Расширенное использование:

Флаг обновления фактически сравнивает входящие файлы с существующими и будет либо добавлять новые файлы, либо обновлять существующие.

Поэтому, если вы хотите добавить / обновить определенный подкаталог в zip-файле, просто обновите источник по своему усмотрению, а затем повторно заархивируйте весь источник с флагом -u. Только измененные файлы будут заархивированы.

Если у вас нет доступа к исходным файлам, вы можете разархивировать zip-файл, затем обновить нужные файлы, а затем повторно заархивировать с флагом -u. Опять же, только измененные файлы будут заархивированы.

Пример:

Исходная структура источника


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt

Обновленная структура источника


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt 
│   │   ├──<b> logs4.txt <i>&lt-- NEW FILE </i></b>

Использование

<b>$ zip -ur existing.zip ParentDir </b>
> updating: ParentDir/ChildDir/Logs (stored 0%)
>   adding: ParentDir/ChildDir/Logs/logs4.txt (stored 96%)
4 голосов
/ 04 сентября 2015

Вы можете использовать: zip -u file.zip path / file_to_update

1 голос
/ 19 марта 2017

Существует также опция -f, которая освежит zip-файл. Его можно использовать для обновления ВСЕХ файлов, которые были обновлены с момента создания zip-файла (при условии, что они находятся в одном и том же месте в древовидной структуре внутри zip-файла).

Если ваш файл называется /myfiles/myzip.zip, все что вам нужно сделать, это

zip -f /myfiles/myzip.zip
0 голосов
/ 12 октября 2017

7zip (7za) можно использовать для добавления / обновления файлов / каталогов:

Пример: Замена (независимо от даты файла) файла MANIFEST.MF в файле JAR. Каталог /source/META-INF содержит файл MANIFEST.MF, который вы хотите поместить в jar (zip):

7za a /tmp/file.jar /source/META-INF/

Только обновление (не заменяет цель, если источник старше)

7za u /tmp/file.jar /source/META-INF/
0 голосов
/ 22 марта 2014

Со стороны структуры архива ZIP - вы можете обновить файл zip без повторного сжатия, вам просто нужно пропустить все файлы, предшествующие файлу, который вы хотите заменить, затем поместить обновленный файл, а затем остальные файлы. И, наконец, вам нужно поместить обновленную центральную структуру каталогов. Однако я сомневаюсь, что наиболее распространенные инструменты позволят вам сделать это.

0 голосов
/ 26 января 2011

да, это возможно.

в системах на основе Linux, просто установите zip, и вы можете вызвать его в командной строке.взгляните на справочную страницу: http://linux.die.net/man/1/zip

, но по моему личному опыту, если возможно, и сжатие не так важно, это лучше работает с простыми tar-файлами и tar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...