Як оновити один файл у архіві zip


86

Чи можна замінити файл на zip-файл, не розпаковуючи архіви, видаляючи старий файл, додаючи новий файл і не переархівуючи його назад?

Причина в тому, що у мене є zip-файл, який справді великий, всередині zip-файлу є один xml, який мені доводиться інколи оновлювати. Розпакування ZIP-архіву та його повторне архівування займає багато часу. Тому я хотів би мати можливість просто замінити один xml всередині zip за допомогою скрипта. Я вже перевіряю наявність оновлень для xml, який я маю.

Тож чи можна просто замінити один xml, не розпаковуючи та не перепаковуючи архіви?

На жаль, я б використовував команду zip, щоб робити подібні речі, але проблема полягає в тому, що сценарій насправді для телефону Android, і zip не є командою, яку я можу використовувати, на жаль, на жаль, я це залишив. Я б використовував zip точно, якби міг, але у мене є лише розпакування для дроїда, а тоді в boxbox є tar, але tar не робить те, що мені потрібно


3
Ви можете змінити назву запитання на щось більш значуще?
Tokland

7
Крім того, питання могло бути одним або двома реченнями. Близько 80% від цього нерозумно.
Призупинено до подальшого повідомлення.

Відповіді:


62

З поштового індексу (1) :

Отримавши ім'я існуючого архіву zip, zip замінить записи з однаковим іменем у архіві zip або додасть записи для нових імен.

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


5
Чи може хтось навести приклад, будь ласка? Я не розумію допомоги команди zip.
Гюстав

12
Скажімо, ви заархівували мою папку за допомогою, zip -r myfolder.zip myfolderякщо хочете оновити myfolder/otherfolder/myfile.txt, продовжуйте редагувати файл і запускайтеzip -r myfolder.zip myfolder/otherfolder/myfile.txt
eakkas

1
Як це зробити, якщо файл, який потрібно замінити, не має однакового імені та тієї ж структури, що і файл, який потрібно повторно розпочати?
Fractaliste

2
@Fractaliste Ви повинні зробити так, щоб він мав однакові назви та структуру;)
Hack5

72

Я виявив, що zipфайл Linux є громіздким для заміни одного файлу на 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).


що, якщо мені доведеться скопіювати лише файл, замість того, щоб створити директор, WEB-INFякий має цей файл.
Рука допомоги

Також у моєму випадку дорогий старий "jar" util зробив свою справу! Дякую!
bitfox

51

Спробуйте наступне:

zip [zipfile] [file to update] 

Приклад:

$ zip test.zip test/test.txt
updating: test/test.txt (stored 0%)

2
Це найпростіше зрозуміти завдяки прикладу, спасибі!
vatsug

2
Візьміть до уваги те, що ви повинні бачити updating:замість того, adding:чи хочете ви оновити файл всередині zip; інакше ви додаєте файли до zip-файлу, а не замінюєте його.
Edenshaw

Ви маєте рацію, я цього не помітив. Оновлено, дякую!
WizardsOfWor

13

Я знаю, що це давнє запитання, але я хотів зробити те саме. Оновіть файл у архіві 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 switch буде шукати змінені / нові файли та додаватиме до архіву zip.


11

Використовуйте прапор оновлення: -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%)


1

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

Якщо ваш файл має ім’я /myfiles/myzip.zip, все, що вам потрібно зробити, це

zip -f /myfiles/myzip.zip

0

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


0

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/

-2

так це можливо.

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

але на моєму особистому досвіді, якщо це можливо, а стиснення не так важливо, це працює краще з простими файлами tar і tar.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.