Подтвердить что ты не робот

Как обновить один файл в zip-архиве

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

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

Так можно ли просто заменить один xml без разархивирования и распаковки?

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

4b9b3361

Ответ 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 &lt-- 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.