Чи є спосіб редагувати файли всередині zip-файлу без явного їх вилучення спочатку?


47

Мені іноді потрібно внести зміни до .zip або .jar-файлу, тому я зазвичай переміщую файл /tmp, витягую всі файли unzip, відредагую декілька файлів, а потім перезавантажую файли заново. Це працює, але це може бути нудно. Чи є утиліта або скрипт оболонки, який я можу використовувати для редагування файлу всередині zip-файлу без явного виклику unzipта zip(навіть якщо це лише обгортка навколо цих команд)?


Просто цікаво, чи відповідь працює на .jar файли? (Я його там не перевіряв.)
Берое

@beroe Це повинно, оскільки вони використовують алгоритм стиснення zip. Насправді це була моя основна мотивація до пошуку рішення, оскільки у мене були розгорнуті файли .war на сервері додатків, що мені не здавалося перекомпонувати та повторно розгорнути лише для зміни одного файлу.
austin

Чудово. Я спробую виправити функцію, щоб вона зберігала структуру каталогу всередині архіву. В даний час я думаю, що він працює лише у файлах на рівні кореня, але для моїх цілей підпапки є більш корисними.
берое

@beroe Це дуже круто. Перш ніж запитати це, я збирався кодувати скрипт python для запуску psudo-оболонки "всередині" zip-файлу для виконання довільних команд. Мені було б цікаво, що ви придумали.
austin

Добре, додано ще одне рішення для підтримки підпапок, і воно працює в обмеженому тестуванні.
beroe

Відповіді:


19

Чи знаєте ви ім'я файлу в архіві, перш ніж розпакувати його? Ви можете зробити функцію для розпакування /tmp, редагування та оновлення zip:

zipedit(){
    echo "Usage: zipedit archive.zip file.txt"
    unzip "$1" "$2" -d /tmp 
    vi /tmp/$2 && zip -j --update "$1"  "/tmp/$2" 
}

Як говориться, використання:

zipedit myarchive.zip myfile.txt

Це розпаковує названий файл з архіву, зберігає його /tmp, редагує, а viпотім додає його назад до архіву, при цьому "перев'язуючи" шлях. Додайте до свого .bash_profile, припускаючи bash...

EDIT: Нижче наведена версія, яка працює з підпапками всередині архіву ... Зауважте, не використовуйте косу рису перед назвою папки (тобто myfolder/file.txtне використовуйте /myfolder/file.txt). Якщо ви відредагуєте файл, який ще не існував в архіві, він створить його для вас. Також не впевнений, чи буде він працювати з абсолютним шляхом до zip-файлу. Найкраща палиця з родичем.

zipedit(){
    echo "Usage: zipedit archive.zip folder/file.txt"
    curdir=$(pwd)
    unzip "$1" "$2" -d /tmp 
    cd /tmp
    vi "$2" && zip --update "$curdir/$1"  "$2" 
    # remove this line to just keep overwriting files in /tmp
    rm -f "$2" # or remove -f if you want to confirm
    cd "$curdir"
}

Дякую за запитання. Я, мабуть, в кінцевому підсумку скористаюся і цим!

Ще одна редакція: Неперевірено, але я прочитав це, vimі emacsобидва будуть редагувати файли jar безпосередньо?


Я можу підтвердити, що vim працює чудово для редагування zip-файлів з командного рядка в Linux, дякую за пораду!
Томас Біндзюс

60

Vim підтримує прозоре редагування файлів усередині zip-файлів. Просто виконайте:

vim file.zip

і вам буде показаний список файлів всередині zip-архіву. Виберіть потрібний для редагування, змініть те, що ви хочете, та вийдіть за допомогою: x

Якщо vimвідповідає:

Не вдається внести зміни, "модифікований" вимкнено

.. просто запустіть :set modifiableабо :set ma(джерело: https://stackoverflow.com/questions/5745506/vim-modifiable-is-off )


2
До речі, підтримка zip за замовчуванням у vim дозволяє редагувати лише однорівневі ZIP-файли. Якщо вам потрібно редагувати ZIP-файли всередині ZIP-файлів, слід використовувати цей плагін vim .
jesjimher

1
Те саме з emacs.
Майк

4
Це слід позначити як правильну відповідь
Martijn Burger

3
рятівник життя. дійсно крута особливість vim, і теж несподівана
Пітер Пергач

4

Коротка відповідь: НІ.

Якщо це обгортка, ви будете називати ці команди. У будь-якому випадку, найкраще, що я можу придумати, - це відкрити файл, використовуючи file-roller, якщо ви перебуваєте в середовищі X, що може працювати простим подвійним клацанням, залежно від налаштувань. Потім можна двічі клацнути стиснутий файл, щоб відкрити його, а потім ви зможете редагувати його:

$ file-roller b3.zip 

Коли ви зберігаєте відредагований файл, ви повинні отримати це діалогове вікно:

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

введіть тут опис зображення


0

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

Якщо ви менш теоретичні, більш практичні, більше "я не хочу вручну розпаковувати / блискавки" є інструменти, які ви можете використовувати. Арк в Linux - це один, який я використовував. Ви також можете встановити архів за допомогою fuse-zip , хоча це, ймовірно, більше роботи, ніж тимчасовий файл.


не знаю, чому хтось дав -1. +1 для fuse-zip.
myrdd

0

Відповідно до сторінки man для zip(онлайн-версія для зручного посилання: http://linux.die.net/man/1/zip ), zipкоманда містить -uпрапор, який вона характеризує як:

Замініть (оновіть) існуючий запис у zip-архіві, лише якщо він був змінений недавно, ніж версія, яка вже є в zip-архіві.


0

Менеджер файлів каталогу Opus 12 дозволить вам переглядати Zip, потім перетягувати відредагований файл з іншої папки до нього та перезаписувати файл, який ви бажаєте відредагувати, і це зробить все на лету. Дуже легко



0

Ви можете використовувати стандартний текстовий редактор KDE, наприклад:

  1. відкрити архів в архіві менеджера
  2. відкрити текстовий файл у редакторі GUI KDE
  3. збережіть текстовий файл та систему, попросіть оновити архів - натисніть так
  4. не забувайте про дозвіл на архів і папку архіву (моя улюблена помилка)

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