Есть ли способ редактировать файлы внутри zip-файла без предварительного извлечения их?

47748
austin

Иногда мне нужно внести изменения в файл .zip или .jar, поэтому я обычно перемещаю файл в /tmp, извлекаю все файлы с помощью unzip, редактирую несколько файлов, а затем заново заархивирую файлы. Это работает, но это может быть утомительно. Есть ли утилита или сценарий оболочки, которые я могу использовать для редактирования файла внутри zip-файла без явного вызова unzipи zip(даже если это просто оболочка для этих команд)?

38
Просто любопытно, работает ли ответ на файлы .jar? (Я не проверял это там.) beroe 10 лет назад 0
@beroe Должен, так как те используют алгоритм сжатия почтового индекса. На самом деле это было моей главной мотивацией для поиска решения, потому что у меня были файлы .war, развернутые на сервере приложений, которые я не испытывал, как перепаковывать и развертывать только для изменения одного файла. austin 10 лет назад 0
Отлично. Я собираюсь попытаться исправить функцию, чтобы она сохраняла структуру каталогов внутри архива. В настоящее время я думаю, что он работает только с файлами на корневом уровне, но для моих целей подпапки более полезны. beroe 10 лет назад 0
@beroe Это довольно круто. Прежде чем спросить об этом, я собирался написать код на python для запуска псевдооболочки «внутри» zip-файла для выполнения произвольных команд. Мне было бы интересно, что вы придумали. austin 10 лет назад 0
ОК, добавлено еще одно решение для поддержки подпапок, и оно работает в * ограниченном * тестировании. beroe 10 лет назад 0

8 ответов на вопрос

50
jesjimher

Vim supports transparently editing files inside zip files. Just execute:

vim file.zip

and you will be shown a list of files inside zip archive. Choose the one you want to edit, change what you want, and exit with :x

If vim responds with:

Cannot make changes, 'modifiable' is off

.. just run :set modifiable or :set ma (source: https://stackoverflow.com/questions/5745506/vim-modifiable-is-off)

Кстати, поддержка zip по умолчанию в vim позволяет редактировать только ZIP-архивы одного уровня. Если вам нужно редактировать ZIP внутри ZIP, вы должны использовать [этот плагин vim] (http://www.vim.org/scripts/script.php?script_id=2206). jesjimher 9 лет назад 1
То же самое с Emacs. Mike 8 лет назад 1
Это должно быть помечено как правильный ответ Martijn Burger 8 лет назад 3
спасатель жизни действительно классная особенность vim, и довольно неожиданная Peter Perháč 7 лет назад 2
15
beroe

Знаете ли вы имя файла в архиве перед его разархивированием? Вы можете создать функцию для распаковки /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...

РЕДАКТИРОВАТЬ: Ниже приведена версия, которая работает с подпапками внутри архива ... Обратите внимание, не используйте косую черту перед именем папки (т.е. 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, большое спасибо за подсказку! Thomas Bindzus 10 лет назад 0
4
terdon

Краткий ответ: НЕТ.

Если это обертка, вы будете называть эти команды. В любом случае, лучшее, что я могу придумать, - это открыть файл с помощью file-roller, если вы находитесь в среде X, который может работать простым двойным щелчком, в зависимости от ваших настроек. Затем вы можете дважды щелкнуть сжатый файл, чтобы открыть его, а затем отредактировать:

$ file-roller b3.zip 

Когда вы сохраните отредактированный файл, вы должны получить этот диалог:

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

enter image description here

0
Proctor

Согласно zipсправочной странице для (онлайн-версия для удобства: http://linux.die.net/man/1/zip ), zipкоманда имеет -uфлаг, который она описывает как:

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

0
Technometry

Диспетчер файлов Directory Opus 12 позволит вам просмотреть Zip, затем перетащить отредактированный файл из другой папки в него и перезаписать файл, который вы хотите отредактировать, и он сделает все это на лету. Очень просто

0
lbrayner

Я написал плагин Vim, который расширяет стандартный zip.vim для просмотра и редактирования вложенных zip-файлов.

https://github.com/lbrayner/vim-rzip

0
tvorez

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

  1. открыть архив в диспетчере архивов
  2. открыть текстовый файл в графическом редакторе KDE
  3. сохраните текстовый файл и система попросит вас обновить архив - нажмите да
  4. не забудьте про разрешение на архив и папку архива (моя любимая ошибка)
Пожалуйста, исправьте форматирование в вашем посте. davidbaumann 6 лет назад 0
-1
Rich Homolka

Краткий педантичный ответ; нет. Если вы думаете о сжатии, вы используете избыточность, чтобы сократить файлы внутри, поэтому любое редактирование изменяет весь файл в архиве, возможно, в архиве.

Если вы менее теоретичны, более практичны, более «я не хочу вручную расстегивать молнию», есть инструменты, которые вы можете использовать. Арк в Linux - это то, что я использовал. Вы также можете смонтировать архив с помощью fuse-zip, хотя это, вероятно, больше, чем временный файл.

Похожие вопросы