Как обновить один файл в zip-архиве
Можно ли заменить файл в zip файле без разархивирования удаления старого файла, добавляющего новый файл и его повторного копирования?
Причина в том, что у меня есть zip файл, который действительно большой, есть один xml внутри zip файла, который мне иногда нужно обновлять. Распаковка zip и перетипирование занимает много времени. Поэтому я хотел бы просто заменить один xml внутри zip через script. У меня уже есть проверки обновлений для xml, которые у меня есть.
Так можно ли просто заменить один xml без разархивирования и распаковки?
Извините, я бы использовал команду zip, чтобы делать что-то вроде этого, но проблема в том, что script на самом деле для телефона Android, а zip - это не команда, которую я могу использовать, к сожалению, извините. Я бы использовал zip определенно, если бы мог, но у меня есть только распаковка для дроида, а затем есть tar в busybox, но tar не делает то, что мне нужно.
Ответы
Ответ 1
От zip (1):
При задании имени существующего zip-архива zip заменит идентичные записи в zip-архиве или добавит записи для новых имен.
Поэтому просто используйте команду zip
, как обычно, для создания нового .zip файла, содержащего только один файл, за исключением указанного вами имени файла .zip будет существующий архив.
Ответ 2
Я нашел файл 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
).
Ответ 3
Я знаю, что это старый вопрос, но я хотел сделать то же самое. Обновите файл в zip-архиве. И ни один из приведенных выше ответов не помог мне.
Вот что я сделал. Создан временный каталог abc
. Скопировано file.zip
в abc
и извлечено файл в этом каталоге. Я отредактировал файл, который я хотел отредактировать.
Затем, находясь в abc
, выполните следующую команду
[email protected] ~/temp/abc $ zip -u file.zip
updating: content/js/ (stored 0%)
updating: content/js/moduleConfig.js (deflated 69%)
-u
переключатель будет искать измененные/новые файлы и будет добавлен в архив zip.
Ответ 4
Попробуйте следующее:
zip [zipfile] [file to update]
Пример:
$ zip test.zip test/test.txt
adding: test/test.txt (stored 0%)
Ответ 5
Используйте флаг обновления: -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
│ │ ├── logs4.txt <-- NEW FILE
Использование
$ zip -ur existing.zip ParentDir
> updating: ParentDir/ChildDir/Logs (stored 0%)
> adding: ParentDir/ChildDir/Logs/logs4.txt (stored 96%)
Ответ 6
Вы можете использовать:
zip -u file.zip path/file_to_update
Ответ 7
Существует также опция -f, которая будет освежать zip файл. Он может использоваться для обновления ВСЕХ файлов, которые были обновлены с момента создания zip (при условии, что они находятся в одном и том же месте в древовидной структуре в zip файле).
Если ваш файл имеет имя /myfiles/myzip.zip, все, что вам нужно сделать, это
zip -f /myfiles/myzip.zip
Ответ 8
Со стороны структуры ZIP-архива - вы можете обновить zip файл без его повторного сжатия, вам просто нужно будет пропустить все файлы, которые находятся перед файлом, который вам нужно заменить, затем поместить обновленный файл, а затем остальные файлы. И, наконец, вам нужно будет поместить обновленную центральную структуру каталогов.
Однако я сомневаюсь, что большинство обычных инструментов позволят вам сделать это.
Ответ 9
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/
Ответ 10
да его возможно.
на Linux-системах просто установите zip, и вы можете вызвать его в командной строке. посмотрите manpage: http://linux.die.net/man/1/zip
но в моем личном опыте, если это возможно, и сжатие не так важно, это лучше работает с обычными файлами tar и tar.