Agregar archivo a archivos tbz

8

Estoy buscando una manera de actualizar miles de archivos .tbz, así que lo haré con un script de shell. Necesito agregar un archivo a cada uno.

Mi pregunta es, ¿hay una forma más rápida de hacer esto sin extraer el contenido de cada tbz y luego volver a comprimirlo con el nuevo archivo incluido en el tar contenido? ¿Cómo se verían los comandos?

Gracias

Botella Cero
fuente
Una alternativa obvia es colocar archivos comprimidos en un tarball sin comprimir. Pero eso cambia el formato de datos, por lo que podría no ser viable para usted, y puede ser ineficiente para grandes cantidades de archivos pequeños con redundancia entre ellos.
Restablece a Mónica

Respuestas:

12

Si bien tarpuede agregar archivos a un archivo ya existente, no se puede comprimir. Tendrás que ir bunzip2al archivo comprimido, dejando un tarball estándar. Luego puede usar tarla capacidad de agregar archivos a un archivo existente y luego volver a comprimir con bzip2.

Del manual:

 -r      Like -c, but new entries are appended to the archive.  Note that this only
         works on uncompressed archives stored in regular files.  The -f option is
         required.
DopeGhoti
fuente
es cierto
Kiwy
Este es un método, pero no es el único. Es posible modificar un flujo bzip2 sin descomprimirlo por completo. No sé si es posible hacerlo de una manera que permita agregar limpiamente a un archivo tar, pero dhag muestra un método parcial.
Gilles 'SO- deja de ser malvado'
10

La otra respuesta es correcta: no puede actualizar correctamente un archivo tar comprimido sin descomprimirlo. La documentación de GNU tar lo sugiere, e intentar actualizar falla con un mensaje de error explícito:

$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2 
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now

Sin embargo, si está interesado en una solución sucia que no requiera descompresión, puedo proporcionarle una, según las siguientes observaciones:

  • Agregar secuencias de bzip2 usando cates compatible y produce una secuencia de bzip2 válida (lo mismo ocurre con gzip);
  • agregar tars usando catno produce un archivo tar válido, por eso --concatenateexiste la opción, pero podemos pedirle a tar que pretenda que es válido:

Puede parecerle más intuitivo querer o intentar usar cat para concatenar dos archivos en lugar de usar la --concatenateoperación; después de todo, cat es la utilidad para combinar archivos.

Sin embargo, los archivos tar incorporan un marcador de fin de archivo que debe eliminarse si los archivos concatenados deben leerse correctamente como un archivo. --concatenateelimina el marcador de fin de archivo del archivo de destino antes de agregar cada nuevo archivo. Si usa cat para combinar los archivos, el resultado no será un archivo de formato tar válido. Si necesita recuperar archivos de un archivo que se agregó al uso de la utilidad cat, use la opción --ignore-zeros( -i).

En base a este conocimiento, podemos hacer, por ejemplo:

cat {one,two}.tar.bz2 >combined.tar.bz2

Esto resulta, como explica el fragmento de documentación anterior, en un archivo tar no válido, pero con el uso --ignore-zeros, aún se puede leer completamente:

## Show contents of `one.tar.bz2'
$ tar tf one.tar.bz2
a
b

## Show contents of `two.tar.bz2'
$ tar tf two.tar.bz2
c

## Show contents of `combined.tar.bz2', bypassing the bad format
$ tar tif combined.tar.bz2
a
b
c

Observe cómo lo anterior enumera los tres archivos de los dos archivos originales, mientras que omitir -i(correctamente) solo enumera los archivos del primer archivo original:

$ tar tf combined.tar.bz2 
a
b

Una vez más, eso no es más que un truco sucio, pero podría ser útil si controla los lados de escritura y lectura y puede asegurarse de que -ise usará al intentar leer de los archivos creados de esta manera.

dhag
fuente
Que gracias muy interesante por la respuesta detallada. Lamentablemente, no tengo el control del proceso que finalmente leerá estos archivos.
BottleZero
Esto se puede usar para "ocultar" algunos archivos en un archivo para que alguien que extraiga casualmente solo obtenga el contenido del tarball original, pero aquellos que sepan agregarlo ia la línea de comando verán todo.
Monty Harder