2011-01-25 21 views
44

¿Es posible reemplazar un archivo en un archivo zip sin descomprimir borrar el archivo anterior, agregar el nuevo archivo y volver a descomprimirlo?Cómo actualizar un archivo en un archivo zip

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. Descomprimir el zip y volver a descomprimirlo lleva mucho tiempo. Así que me gustaría simplemente poder reemplazar el xml dentro del archivo zip a través de un script. Ya tengo esos controles para las actualizaciones en el xml que tengo.

¿Es posible simplemente reemplazar el xml sin descomprimir y volver a descomprimir?

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 dejé. Habría utilizado postal definitivamente si pudiera, pero sólo tengo descomprimir para androide y luego está el alquitrán en busybox pero el alquitrán no hace lo que necesito

+3

se puede cambiar el pregunta título a algo más significativo? – tokland

+6

Además, la pregunta podría haber sido una o dos oraciones. Alrededor del 80% de él está divagando. –

Respuesta

37

De zip(1):

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

Entonces sólo tiene que utilizar el comando zip como lo haría normalmente para crear un nuevo archivo .zip que contiene sólo un archivo que, salvo el nombre del archivo .zip que especifique será el archivo existente.

+2

¿Podría alguien dar un ejemplo, por favor? No entiendo la ayuda del comando zip. – Gustave

+7

Digamos que has comprimido myfolder usando 'zip -r myfolder.zip myfolder' si quieres actualizar' myfolder/otherfolder/myfile.txt', adelante y edita el archivo y ejecuta 'zip -r myfolder.zip myfolder/otherfolder/miarchivo.txt' – eakkas

+1

¿Cómo hacerlo si el archivo que se va a reemplazar no tiene el mismo nombre ni la misma estructura que el archivo que se repalmará? – Fractaliste

-2

sí, es posible.

en sistemas basados ​​en Linux simplemente instale zip y puede 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 y tar.

54

He encontrado que el archivo Linux zip es engorroso para reemplazar un solo archivo en un zip. La utilidad jar del Java Development Kit puede ser más fácil. Considere la tarea común de la actualización de WEB/web.xml en un archivo JAR (que es sólo un archivo zip):

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

Aquí, path/to/dir es la ruta a un directorio que contiene el directorio WEB-INF (que a su vez contiene web.xml).

13

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

Esto es lo que hice. Se creó el directorio temporal abc. Copió file.zip a abc y extrajo el archivo en ese directorio. Edité el archivo que quería editar. Entonces mientras se está en abc, ejecutó el comando siguiente

interruptor
[email protected] ~/temp/abc $ zip -u file.zip 
updating: content/js/ (stored 0%) 
updating: content/js/moduleConfig.js (deflated 69%) 

-u buscará nuevos archivos modificados/y se sumará al archivo zip.

13

Pruebe lo siguiente:

zip [zipfile] [file to update] 

Un ejemplo:

$ zip test.zip test/test.txt 
adding: test/test.txt (stored 0%) 
+2

Este es el más fácil de entender gracias al ejemplo, ¡gracias! – vatsug

0

Desde el lado de la estructura de archivo ZIP - se puede actualizar el archivo zip sin volver a comprimir, usted sólo tendrá que omitir todos los archivos que son anteriores al archivo que necesita reemplazar, luego coloque su archivo actualizado y luego el resto de los archivos. Y finalmente deberá colocar la estructura de directorios centeral actualizada. Sin embargo, dudo que las herramientas más comunes te permitan hacer esto.

3

Se puede utilizar: postal -u file.zip ruta/file_to_update

7

colocar la bandera de actualización: -u

Ejemplo:

zip -ur existing.zip myFolder

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


Uso avanzado:

La bandera de actualización realmente compara los archivos entrantes contra los ya existentes y, o bien añadir 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 la fuente completa con el -u. Solo los archivos modificados serán comprimidos.

Si no tiene acceso a los archivos fuente, puede descomprimir el archivo zip, actualizar los archivos deseados y luego volver a comprimir con el -u. De nuevo, solo los archivos modificados serán comprimidos.

Ejemplo:

Fuente Original Estructura


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

Actualizado Estructura Fuente


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%) 
1

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

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

zip -f /myfiles/myzip.zip 
0

7zip (7za) se puede utilizar para añadir/actualización de archivos/directorios muy bien:

Ejemplo: Sustitución (independientemente de la fecha de archivo) del archivo MANIFEST.MF en un archivo JAR. El directorio /source/META-INF contiene el archivo MANIFEST.MF que desea poner en la jar (ZIP):

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

Sólo actualización (no sustituir el objetivo si el origen es más antiguo)

7za u /tmp/file.jar /source/META-INF/ 
Cuestiones relacionadas