¿Agregar / actualizar un archivo a un archivo tar.gz existente?

73

¿Hay alguna manera de agregar / actualizar un archivo en un archivo tar.gz? Básicamente, tengo un archivo que contiene un archivo /data/data/com.myapp.backup/./files/settings.txty me gustaría extraer ese archivo del archivo (ya hecho) y volver a insertarlo en el archivo una vez que se haya realizado la edición. ¿Cómo puedo lograr esto? ¿Es problemático por el .en el camino?

Naftuli Kay
fuente
2
+1. Esto haría que trabajar en OS X fuera tan fácil. Actualmente, tengo que limpiar a mano un directorio de todos los archivos ocultos .DS_Storey luego volver a tar el directorio.

Respuestas:

15

El formato de archivo tar es solo una serie de archivos concatenados junto con algunos encabezados. No es un trabajo muy complicado separarlo, poner su contenido y volver a armarlo. Dicho esto, Jander describió cómo el alquitrán como programa no tiene las funciones de utilidad para hacer esto y existen complicaciones adicionales con la compresión, que tiene que ocurrir antes y después de hacer un cambio.

¡Sin embargo, hay herramientas para el trabajo! Existen al menos dos sistemas que le permitirán realizar un montaje en bucle invertido de un archivo tar comprimido en una carpeta y luego realizar los cambios en el sistema de archivos. Cuando haya terminado, desmonte la carpeta y su archivo comprimido estará listo para rodar.

La primera opción sería el proyecto de montaje en archivo para FUSE . Aquí hay un tutorial sobre eso . Su sistema probablemente ya tenga FUSE y, si no lo tiene, su distribución debería tener una opción para ello.

La otra opción es tarfs . Es más simple de usar , pero he oído que tiene algunos problemas para corromper los archivos bzip2, por lo que primero puede probarlo bastante a fondo.

Caleb
fuente
1
Yo uso AVFS , que está empaquetado en Ubuntu y Debian. ¿Sabes cómo archivemount y tarfs se comparan con AVFS?
Gilles 'SO- deja de ser malvado'
Honestamente no, no, aunque tengo curiosidad por ver AVFS ahora que mencionas la alternativa. He usado tanto archivemount como tarfs, pero fue durante un proyecto retirado hace mucho tiempo y no conozco su estado actual. A partir de esa experiencia, decidí que la idea era errónea conceptualmente, incluso si la implementación funcionaba perfectamente.
Caleb
Eché un vistazo a cómo funciona archivemount. No modifica el archivo .tar.gz existente, pero cuando desmonta, cambia el nombre del original y crea un nuevo archivo tar en su lugar. Si está buscando una buena experiencia de usuario, es excelente, pero si está buscando evitar reescribir todo el archivo por razones de eficiencia, no lo ayudará.
Jander
@Jander Eso es por señalar eso. Sin embargo, estoy bastante seguro de que se aplica a todas las opciones de montaje de archivos comprimidos. El problema es que las partes individuales del archivo no están comprimidas, los encabezados internos del archivo en general y todo está comprimido y, para que otra cosa se extraiga, es como se espera que gzip se ejecute en todo el conjunto de datos. No hay forma de inyectar algo en medio de esto sin extraerlo y volver a ejecutar la compresión y reescribir todo el archivo de datos. De ahí mi comentario anterior sobre que es la solución incorrecta conceptualmente . Los archivos son archivos.
Caleb
43

Para extraer su archivo de su archivo, puede usarlo tar xzf archive.tar.gz my/path/to/file.txt. Tenga en cuenta que también se crearán los directorios en la ruta del archivo. Use tar t(es decir tar tzf archive.tar.gz) para enumerar los archivos en el archivo.

tarno admite la actualización "in situ" de archivos. Sin embargo, puede agregar archivos al final de un archivo, incluso si tienen la misma ruta que un archivo que ya está en el archivo. En ese caso, ambas copias del archivo estarán en el archivo, y el archivo agregado más adelante anulará el anterior. El comando a usar para esto es tar r(o tar usolo para agregar archivos que son más nuevos que el archivo) es el comando a usar. El .en el camino no debería ser un problema.

Sin embargo, hay un inconveniente: no se puede agregar a un archivo comprimido. Entonces tendrías que hacer:

gunzip archive.tar.gz
tar rf archive.tar data/data/com.myapp.backup/./files/settings.txt
gzip archive.tar

Lo que probablemente no sea lo que quieres escuchar, ya que significa reescribir todo el archivo dos veces. Si no es un archivo muy grande, podría ser mejor descomprimirlo todo y luego volverlo a tatar después de editarlo. Alternativamente, puede usar un archivo sin comprimir.

Jander
fuente
Esta respuesta solo es correcta en la medida en que trata con el tarprograma estándar . Tar como formato de archivo es realmente muy accesible. Podría escribir fácilmente un script para actualizar el contenido usted mismo, pero hay otras herramientas que ya lo hacen .
Caleb
23
También podría hacerlo de la manera Unix:gzip -dc archive.tar.gz | tar -r data/data/com.myapp.backup/./files/settings.txt | gzip >archive_new.tar.gz
Simon Richter
2
IIRC puede simplemente concatenar dos archivos gzip'ed. El resultado es un archivo gzip'ed más grande que contiene ambos archivos sin comprimir concatenados.
FUZxxl
Una vez que el archivo se ha descomprimido, ¿no es posible usar el indicador de actualización?
pietro
@FUZxxl +1 por mencionar la concatenación de gzip
Johan Boulé
9

Originalmente, Tar estaba destinado a usarse para cintas, por lo que "reemplazar" archivos no está realmente en el diseño. Sin embargo, puede usar --delete para eliminar el archivo del tar original y luego -u para actualizar el tar y volver a agregar el archivo. Puede tomar un poco, ya que tar necesita reorganizar el archivo internamente.

rleibman
fuente
¡Bienvenido a StackExchange! Su respuesta solo contiene una sugerencia ya hecha en otra respuesta . Lea las otras respuestas a una pregunta antes de responder, para evitar crear duplicados.
JigglyNaga
1
Edité mi respuesta un poco. No creo que la otra respuesta mencione --delete
rleibman
-5

en mi Linux x86_64 GNU / Linux para realizar esa operación, simplemente uso el siguiente comando:

tar cvfpz /path/archive.tar -T list.txt

Este comando causa la creación de un archivo comprimido /pathutilizando una lista de archivos incluidos en el list.txtarchivo.

usuario64312
fuente
66
Eso sobrescribe un archivo existente /path/archive.tar, en lugar de agregar / actualizar ese archivo.
Anthon