The other answer is correct: you cannot properly update a compressed tar archive without uncompressing it. The GNU tar documentation hints at it, and attempting to update fails with an explicit error message:
$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now
However, should you be interested in a dirty sort-of-works solution that doesn't require decompression, I can provide one, based on the following observations:
- Appending bzip2 streams using
cat
is supported and produces a valid bzip2 stream (the same is true of gzip);
- appending tars using
cat
does not produce a valid tar file, which is why the --concatenate
option exists, but we can ask tar to pretend it's valid:
It may seem more intuitive to you to want or try to use cat to concatenate two archives instead of using the --concatenate
operation; after all, cat is the utility for combining files.
However, tar archives incorporate an end-of-file marker which must be removed if the concatenated archives are to be read properly as one archive. --concatenate
removes the end-of-archive marker from the target archive before each new archive is appended. If you use cat to combine the archives, the result will not be a valid tar format archive. If you need to retrieve files from an archive that was added to using the cat utility, use the --ignore-zeros
(-i
) option.
Based on this knowledge, we can do, for example:
cat {one,two}.tar.bz2 >combined.tar.bz2
This results, as the documentation snippet above explains, in an invalid tar file, but using --ignore-zeros
, it can still be read fully:
## 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
Note how the above lists all three files from the original two archives, whereas omitting -i
(correctly) lists only the files from the first original archive:
$ tar tf combined.tar.bz2
a
b
Once again, that's nothing more than a dirty trick, but it could be useful if you control both the writing and reading sides and can make sure that -i
will be used when attempting to read from files created in this way.