Можно ли заменить файл в zip-файле без разархивирования, удалив старый файл, добавив новый файл и повторно сжав его?
Причина в том, что у меня есть zip-файл, который действительно большой, внутри zip-файла есть один xml, который мне иногда приходится обновлять. Распаковка и повторная архивация молнии занимает много времени. Поэтому я хотел бы просто заменить один xml внутри zip через скрипт. У меня уже есть проверки на наличие обновлений в XML, который у меня есть.
Так можно ли просто заменить один xml без разархивирования и повторного сжатия?
Извините, я бы использовал команду zip для таких вещей, но проблема в том, что скрипт на самом деле предназначен для телефона Android, а zip не является командой, которую я могу использовать, к сожалению, извините, я пропустил это. Я бы определенно использовал zip, если бы мог, но у меня есть только распаковка для droid, а затем в busybox есть tar, но tar не делает то, что мне нужно
Ответы:
Из застежки-молнии (1) :
Поэтому просто используйте
zip
команду, как обычно, для создания нового файла .zip, содержащего только этот файл, за исключением того, что указанное вами имя файла .zip будет существующим архивом.источник
zip -r myfolder.zip myfolder
если хотите обновитьmyfolder/otherfolder/myfile.txt
, отредактируйте файл и запуститеzip -r myfolder.zip myfolder/otherfolder/myfile.txt
Я обнаружил, что
zip
файл Linux является громоздким для замены одного файла в zip-архиве.jar
Утилита из комплекта Java Development Kit может быть проще. Рассмотрим обычную задачу обновленияWEB/web.xml
в файле JAR (который является просто файлом zip):Здесь
path/to/dir
путь к каталогу, содержащемуWEB-INF
каталог (который, в свою очередь, содержитweb.xml
).источник
WEB-INF
которого есть этот файл.Попробуйте следующее:
Пример:
$ zip test.zip test/test.txt updating: test/test.txt (stored 0%)
источник
updating:
вместо тогоadding:
, чтобы обновить файл внутри zip-архива; в противном случае вы добавляете файлы в zip-архив, а не заменяете его.Я знаю, что это старый вопрос, но я хотел сделать то же самое. Обновите файл в zip-архиве. И ни один из приведенных выше ответов мне не помог.
Вот что я сделал. Создан временный каталог
abc
. Скопированоfile.zip
вabc
и извлеченный файл в этом каталоге. Я отредактировал файл, который хотел отредактировать. Затем, находясь внутриabc
, выполнила следующую команду-u
переключатель будет искать измененные / новые файлы и добавлять их в zip архив.источник
Используйте флаг обновления:
-u
Пример:
Эта команда сожмет и добавит
myFolder
(и его содержимое) в файлexisting.zip
.Расширенное использование:
Флаг обновления фактически сравнивает входящие файлы с существующими и либо добавляет новые файлы, либо обновляет существующие.
Поэтому, если вы хотите добавить / обновить определенный подкаталог в zip-файле, просто обновите источник по своему усмотрению, а затем повторно заархивируйте весь источник с помощью
-u
флага. Будут заархивированы только измененные файлы.Если у вас нет доступа к исходным файлам, вы можете разархивировать zip-файл, затем обновить нужные файлы, а затем повторно заархивировать с
-u
флагом. Опять же, будут заархивированы только измененные файлы.Пример:
Исходная исходная структура
Обновленная структура источника
Применение
источник
Вы можете использовать: zip -u file.zip path / file_to_update
источник
Также есть опция -f, которая обновит zip-файл. Его можно использовать для обновления ВСЕХ файлов, которые были обновлены с момента создания zip-архива (при условии, что они находятся в одном месте в древовидной структуре внутри zip-файла).
Если ваш файл называется /myfiles/myzip.zip, все, что вам нужно сделать, это
источник
Со стороны структуры ZIP-архива - вы можете обновить zip-файл без его повторного сжатия, вам просто нужно будет пропустить все файлы, предшествующие файлу, который вам нужно заменить, затем поместить обновленный файл, а затем остальные файлы. И, наконец, вам нужно будет разместить обновленную центральную структуру каталогов. Однако я сомневаюсь, что большинство обычных инструментов позволят вам это сделать.
источник
7zip
(7za) можно использовать для добавления / обновления файлов / каталогов:Пример: замена (независимо от даты файла)
MANIFEST.MF
файла в файле JAR./source/META-INF
Каталог содержитMANIFEST.MF
файл , который вы хотите поместить вjar
(почтовый индекс):7za a /tmp/file.jar /source/META-INF/
Только обновление (не заменяет цель, если источник старше)
7za u /tmp/file.jar /source/META-INF/
источник
да это возможно.
в системах на базе Linux просто установите zip, и вы можете вызвать его из командной строки. взгляните на страницу руководства: http://linux.die.net/man/1/zip
но по моему личному опыту, если возможно и сжатие не так важно, это лучше работает с простыми файлами tar и tar.
источник