Mientras tar
puede agregar archivos a un archivo ya existente, no se puede comprimir. Tendrás que bunzip2
el archivo comprimido, dejando un tarball estándar. A continuación, puede utilizar tar
la 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.
La otra respuesta es correcta:no puede actualizar correctamente un archivo tar comprimido sin descomprimirlo. La documentación tar de GNU lo insinúa y el intento de actualización 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:
- Adjuntar flujos bzip2 usando
cat
es compatible y produce un flujo bzip2 válido (lo mismo ocurre con gzip); - añadiendo archivos tar usando
cat
no produce un archivo tar válido, por lo que--concatenate
existe la opción, pero podemos pedirle a tar que simule que es válida:
Puede parecerle más intuitivo querer o intentar usar cat para concatenar dos archivos en lugar de usar el --concatenate
operació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 se van a leer correctamente como un solo archivo. --concatenate
elimina 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ó usando la utilidad cat, use el --ignore-zeros
(-i
) opción.
Con base en este conocimiento, podemos hacer, por ejemplo:
cat {one,two}.tar.bz2 >combined.tar.bz2
Esto da como resultado, como explica el fragmento de documentación anterior, un archivo tar no válido, pero usando --ignore-zeros
, todavía se puede leer completo:
## 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 omite -i
(correctamente) enumera solo 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 tanto el lado de escritura como el de lectura y puede asegurarse de que -i
se utilizará cuando se intente leer archivos creados de esta forma.