Cómo actualizar un archivo en un archivo zip

86

¿Es posible reemplazar un archivo en un archivo zip sin descomprimir, eliminar el archivo anterior, agregar el nuevo archivo y volver a comprimirlo?

La razón es que tengo un archivo zip que es realmente grande, hay un xml dentro del archivo zip que tengo que actualizar a veces. Abrir la cremallera y volver a cerrarla lleva mucho tiempo. Así que me gustaría poder reemplazar el xml dentro del zip a través de un script. Ya tengo que verifica si hay actualizaciones en el xml que tengo.

Entonces, ¿es posible simplemente reemplazar el xml sin descomprimir y volver a comprimir?

Lo siento, usaría el comando zip para hacer cosas como esa, pero el problema es que el script es en realidad para un teléfono Android y zip no es un comando que pueda usar, lamentablemente, lo siento, lo dejé fuera. Habría usado zip definitivamente si pudiera, pero solo tengo descomprimir para droid y luego hay alquitrán en busybox pero tar no hace lo que necesito

usuario577732
fuente
3
¿Puedes cambiar el título de la pregunta por algo más significativo?
tokland
7
Además, la pregunta podría haber sido una o dos frases. Alrededor del 80% son divagaciones.
Pausado hasta nuevo aviso.

Respuestas:

62

Desde zip (1) :

Cuando se le da el nombre de un archivo zip existente, zip reemplazará las entradas con nombres idénticos en el archivo zip o agregará entradas para nuevos nombres.

Por lo tanto, use el zipcomando como lo haría normalmente para crear un nuevo archivo .zip que contenga solo ese archivo, excepto que el nombre de archivo .zip que especifique será el archivo existente.

Por favor levantese
fuente
5
¿Alguien podría dar un ejemplo, por favor? No entiendo la ayuda del comando zip.
Gustave
12
Digamos que comprimió myfolder usando zip -r myfolder.zip myfoldersi desea actualizar myfolder/otherfolder/myfile.txt, siga adelante, edite el archivo y ejecútelozip -r myfolder.zip myfolder/otherfolder/myfile.txt
eakkas
1
¿Cómo hacer eso si el archivo a reemplazar no tiene el mismo nombre ni la misma estructura que el archivo a reemplazar?
Fractaliste
2
@Fractaliste Tienes que hacer que tenga el mismo nombre y estructura;)
Hack5
72

Encontré que el ziparchivo de Linux es engorroso para reemplazar un solo archivo en un zip. La jarutilidad del Java Development Kit puede ser más sencilla. Considere la tarea común de actualizar WEB/web.xmlen un archivo JAR (que es solo un archivo zip):

jar -uf path/to/myapp.jar -C path/to/dir WEB-INF/web.xml

Aquí path/to/direstá la ruta a un directorio que contiene el WEB-INFdirectorio (que a su vez contiene web.xml).

Cayhorstmann
fuente
¿Qué pasa si tengo que copiar solo el archivo en lugar de crear un director WEB-INFque tenga ese archivo?
Ayudando a la mano
¡También en mi caso, el viejo y querido "jar" util hizo el truco! ¡Gracias!
bitfox
51

Intente lo siguiente:

zip [zipfile] [file to update] 

Un ejemplo:

$ zip test.zip test/test.txt
updating: test/test.txt (stored 0%)
WizardsOfWor
fuente
2
Este es el más fácil de entender gracias al ejemplo, ¡gracias!
vatsug
2
Tenga en cuenta que debería ver en updating:lugar de adding:si desea actualizar un archivo dentro del zip; de lo contrario, está agregando archivos al zip, no reemplazándolo.
Edenshaw
Tienes razón, no me di cuenta de eso. ¡Actualizado, gracias!
WizardsOfWor
13

Sé que esta es una vieja pregunta, pero yo quería hacer lo mismo. Actualice un archivo en un archivo zip. Y ninguna de las respuestas anteriores realmente me ayudó.

Aquí esta lo que hice. Directorio temporal creado abc. Copiado file.zipa abcy se extrae el archivo en ese directorio. Edité el archivo que quería editar. Luego, mientras estaba dentro abc, ejecutó el siguiente comando

user@host ~/temp/abc $ zip -u file.zip
updating: content/js/ (stored 0%)
updating: content/js/moduleConfig.js (deflated 69%)

-u El interruptor buscará archivos nuevos o modificados y los agregará al archivo zip.

tradicional
fuente
11

Utilice la bandera de actualización: -u

Ejemplo:

zip -ur existing.zip myFolder

Este comando comprimirá y agregará myFolder(y su contenido) al archivo existing.zip.


Uso avanzado:

La bandera de actualización en realidad compara los archivos entrantes con los existentes y agregará nuevos archivos o actualizará los existentes.

Por lo tanto, si desea agregar / actualizar un subdirectorio específico dentro del archivo zip, simplemente actualice la fuente como desee y luego vuelva a comprimir toda la fuente con la -ubandera. Solo se comprimirán los archivos modificados.

Si no tiene acceso a los archivos de origen, puede descomprimir el archivo zip, luego actualizar los archivos deseados y luego volver a comprimir con la -ubandera. Nuevamente, solo se comprimirán los archivos modificados.

Ejemplo:

Estructura de fuente original


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt

Estructura de fuente actualizada


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt 
│   │   ├── logs4.txt <-- NEW FILE 

Uso

$ zip -ur existing.zip ParentDir 
> updating: ParentDir/ChildDir/Logs (stored 0%)
>   adding: ParentDir/ChildDir/Logs/logs4.txt (stored 96%)
Ethan Strider
fuente
5

Puede usar: zip -u file.zip path / file_to_update

Renato Luiz Ramos
fuente
1

También existe la opción -f que refrescará el archivo zip. Se puede utilizar para actualizar TODOS los archivos que se han actualizado desde que se generó el zip (asumiendo que están en el mismo lugar dentro de la estructura de árbol dentro del archivo zip).

Si su archivo se llama /myfiles/myzip.zip, todo lo que tiene que hacer es

zip -f /myfiles/myzip.zip
gvrocha
fuente
0

Desde el lado de la estructura del archivo ZIP: puede actualizar el archivo zip sin volver a comprimirlo, solo tendrá que omitir todos los archivos anteriores al archivo que necesita reemplazar, luego coloque su archivo actualizado y luego el resto de los archivos. Y finalmente deberá poner la estructura de directorio central actualizada. Sin embargo, dudo que las herramientas más comunes te permitan hacer esto.

Nickolay Olshevsky
fuente
0

7zip (7za) se puede usar para agregar / actualizar archivos / directorios muy bien:

Ejemplo: Reemplazo (independientemente de la fecha del archivo) el MANIFEST.MFarchivo en un archivo JAR. El /source/META-INFdirectorio contiene el MANIFEST.MFarchivo que desea poner en el jar(zip):

7za a /tmp/file.jar /source/META-INF/

Solo actualizar (no reemplaza el destino si la fuente es anterior)

7za u /tmp/file.jar /source/META-INF/
mzsolt
fuente
-2

si es posible.

en los sistemas basados ​​en Linux, simplemente instale zip y podrá llamarlo en la línea de comandos. eche un vistazo a la página de manual: http://linux.die.net/man/1/zip

pero en mi experiencia personal, si es posible y la compresión no es tan importante, esto funciona mejor con archivos tar simples y tar.

El surrican
fuente