¿Hay alguna manera de editar archivos dentro de un archivo zip sin extraerlos explícitamente primero?


47

A veces necesito hacer cambios en un archivo .zip o .jar, por lo que generalmente muevo el archivo a /tmp, extraigo todos los archivos unzip, edito algunos archivos y luego vuelvo a comprimirlos. Esto funciona, pero puede ser tedioso. ¿Hay alguna utilidad o script de shell que pueda usar para editar un archivo dentro de un archivo zip sin llamar explícitamente unzipy zip(incluso si es solo un contenedor alrededor de estos comandos)?


¿Solo tiene curiosidad si la respuesta funciona en archivos .jar? (No lo
probé

@beroe Debería, ya que aquellos usan el algoritmo de compresión zip. Esa fue en realidad mi principal motivación para buscar una solución porque tenía archivos .war implementados en un servidor de aplicaciones que no tenía ganas de volver a empaquetar y volver a implementar solo para modificar un solo archivo.
Austin

Excelente. Voy a tratar de arreglar la función para que conserve la estructura del directorio dentro del archivo. Actualmente creo que solo funciona en archivos a nivel raíz, pero para mis propósitos, las subcarpetas son más útiles.
Beroe

@beroe Eso es genial. Antes de preguntar esto, iba a codificar un script de Python para lanzar un psudo-shell "dentro" del archivo zip para ejecutar comandos arbitrarios. Me interesaría lo que se te ocurra.
Austin

OK, se agregó otra solución para admitir subcarpetas y funciona en pruebas limitadas .
Beroe

Respuestas:


19

¿Conoces el nombre del archivo en el archivo antes de descomprimirlo? Puede hacer una función para descomprimir /tmp, editar y actualizar el zip:

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

Como dice, el uso es:

zipedit myarchive.zip myfile.txt

Esto desempaqueta el archivo con nombre del archivo, lo guarda /tmp, lo edita y viluego lo vuelve a agregar al archivo, mientras "desecha" la ruta. Agregue a su .bash_profile, suponiendo bash...

EDITAR: A continuación se muestra una versión que funciona con subcarpetas dentro del archivo ... Nota, no use una barra inclinada antes del nombre de la carpeta (es decir, myfolder/file.txtno use /myfolder/file.txt). Si edita un archivo que aún no existía en el archivo, lo creará para usted. Tampoco estoy seguro de si funcionará con la ruta absoluta al archivo zip. Mejor palo con pariente.

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"
}

Gracias por la pregunta ¡Probablemente termine usando este también!

Otra edición: Sin probar, pero lo leí vimy emacs¿editarán ambos archivos jar directamente?


Puedo confirmar que vim funciona espléndido para editar archivos zip desde la línea de comandos en Linux, ¡muchas gracias por el consejo!
Thomas Bindzus

60

Vim admite la edición transparente de archivos dentro de archivos zip. Solo ejecuta:

vim file.zip

y se le mostrará una lista de archivos dentro del archivo zip. Elija el que desea editar, cambie lo que desee y salga con: x

Si vimresponde con:

No se pueden realizar cambios, 'modificable' está desactivado

.. simplemente ejecute :set modifiableo :set ma(fuente: https://stackoverflow.com/questions/5745506/vim-modifiable-is-off )


2
Por cierto, el soporte zip predeterminado en vim solo permite editar ZIP de un nivel. Si necesita editar archivos ZIP dentro de ZIP, debe usar este complemento vim .
jesjimher

1
Lo mismo con emacs.
Mike

44
Esto debería ser marcado como la respuesta correcta
Martijn Burger

3
salvavidas Realmente enfriar función de vim, y también bastante inesperado
Peter Perháč

4

Respuesta corta: NO.

Si es un contenedor, está llamando a estos comandos. De todos modos, lo mejor que puedo pensar es abrir el archivo usando file-roller, si está en un entorno X, que podría funcionar con un simple doble clic, dependiendo de su configuración. Luego puede hacer doble clic en el archivo comprimido para abrirlo y luego puede editarlo:

$ file-roller b3.zip 

Cuando guarde su archivo editado, debería obtener este cuadro de diálogo:

También podría crear un script para esto, pero eso se complica si tiene archivos comprimidos que contienen múltiples archivos. Avíseme si eso es lo que necesita y podría cocinar algo.

ingrese la descripción de la imagen aquí


0

Respuesta pedante corta; no. Si piensa en la compresión, está utilizando la redundancia para acortar los archivos internos, por lo que cualquier edición cambia todo el archivo dentro del archivo, posiblemente el archivo.

Si eres menos teórico, más práctico, más "No quiero tener que descomprimir / comprimir manualmente", hay herramientas que puedes usar. Ark en Linux es uno que he usado. También puede montar el archivo con fuse-zip , aunque probablemente sea más trabajo que un archivo temporal.


No sé por qué alguien dio -1. +1 para fuse-zip.
myrdd

0

De acuerdo con la página de manual de zip(versión en línea para una referencia fácil: http://linux.die.net/man/1/zip ), el zipcomando tiene una -ubandera que describe como:

Reemplace (actualice) una entrada existente en el archivo zip solo si se ha modificado más recientemente que la versión que ya está en el archivo zip.


0

El administrador de archivos Directory Opus 12 le permitirá navegar por el Zip, luego arrastrar y soltar el archivo editado desde otra carpeta y sobrescribir el archivo que desea editar, y lo hará todo sobre la marcha. Muy fácil



0

Puede usar el editor de texto estándar de KDE, por ejemplo:

  1. abrir archivo en el administrador de archivos
  2. abrir archivo de texto en el editor de GUI de KDE
  3. guardar el archivo de texto y el sistema le pide que actualice el archivo - haga clic en sí
  4. no te olvides del permiso para el archivo y la carpeta de archivo (mi error favorito)

Corrige el formato en tu publicación.
davidbaumann
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.