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

47

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

Остин
источник
Просто интересно, работает ли ответ на файлы .jar? (Я не проверял это там.)
Beroe
@beroe Должен, так как те используют алгоритм сжатия почтового индекса. На самом деле это было моей главной мотивацией для поиска решения, потому что у меня были файлы .war, развернутые на сервере приложений, которые я не испытывал, как перепаковывать и развертывать просто для изменения одного файла.
Остин
Отлично. Я собираюсь попытаться исправить функцию, чтобы она сохраняла структуру каталогов внутри архива. В настоящее время я думаю, что он работает только с файлами на корневом уровне, но для моих целей подпапки более полезны.
Beroe
@beroe Это довольно круто. Прежде чем спросить об этом, я собирался написать код на python для запуска псевдооболочки «внутри» zip-файла для выполнения произвольных команд. Мне было бы интересно, что вы придумали.
Остин
Хорошо, добавлено другое решение для поддержки подпапок, и оно работает в ограниченном тестировании.
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...

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

jesjimher
источник
2
Кстати, поддержка zip по умолчанию в vim позволяет редактировать только ZIP-архивы одного уровня. Если вам нужно редактировать внутри ZIP - молнии, вы должны использовать этот плагин ВИМ .
jesjimher
1
То же самое с Emacs.
Майк
4
Это должно быть помечено как правильный ответ
Мартейн Бургер
3
спасатель жизни действительно классная особенность vim, и довольно неожиданная тоже
Peter Perháč
4

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

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

$ file-roller b3.zip 

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

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

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

terdon
источник
0

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

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

Рич Гомолка
источник
не знаю, почему кто-то дал -1. +1 за fuse-zip.
Мирдд
0

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

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

проктор
источник
0

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

Technometry
источник
0

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

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

lbrayner
источник
как вы устанавливаете это на Linux?
Пандрей
Я добавил инструкции по установке в README хранилища . Пожалуйста, проверьте снова.
lbrayner
0

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

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