Mentre tar
può aggiungere file ad un archivio già esistente, non può essere compresso. Dovrai bunzip2
l'archivio compresso, lasciando un tarball standard. Puoi quindi utilizzare tar
capacità di aggiungere file a un archivio esistente e quindi ricomprimere con bzip2
.
Dal manuale:
-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.
L'altra risposta è corretta:non è possibile aggiornare correttamente un archivio tar compresso senza decomprimerlo. La documentazione di GNU tar lo suggerisce e il tentativo di aggiornamento fallisce con un messaggio di errore esplicito:
$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now
Tuttavia, se sei interessato a una soluzione sporca che non richiede decompressione, posso fornirne una, sulla base delle seguenti osservazioni:
- Aggiunta di flussi bzip2 utilizzando
cat
è supportato e produce un flusso bzip2 valido (lo stesso vale per gzip); - aggiungendo tar usando
cat
non produce un file tar valido, motivo per cui il file--concatenate
opzione esiste, ma possiamo chiedere a tar di far finta che sia valida:
Potrebbe sembrarti più intuitivo voler o provare a usare cat per concatenare due archivi invece di usare il
--concatenate
funzionamento; dopo tutto, cat è l'utilità per combinare i file.Tuttavia, gli archivi tar incorporano un marcatore di fine file che deve essere rimosso se gli archivi concatenati devono essere letti correttamente come un unico archivio.
--concatenate
rimuove il contrassegno di fine archivio dall'archivio di destinazione prima che ogni nuovo archivio venga aggiunto. Se usi cat per combinare gli archivi, il risultato non sarà un archivio in formato tar valido. Se hai bisogno di recuperare file da un archivio che è stato aggiunto utilizzando l'utility cat, usa--ignore-zeros
(-i
) opzione.
Sulla base di questa conoscenza, possiamo fare, ad esempio:
cat {one,two}.tar.bz2 >combined.tar.bz2
Ciò si traduce, come spiega il frammento di documentazione sopra, in un file tar non valido, ma utilizzando --ignore-zeros
, può ancora essere letto integralmente:
## 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
Nota come quanto sopra elenca tutti e tre i file dai due archivi originali, omettendo -i
(correttamente) elenca solo i file del primo archivio originale:
$ tar tf combined.tar.bz2
a
b
Ancora una volta, non è altro che uno sporco trucco, ma potrebbe essere utile se controlli sia la parte di scrittura che quella di lettura e puoi assicurarti che -i
verrà utilizzato quando si tenta di leggere da file creati in questo modo.