Zatímco tar
může přidávat soubory do již existujícího archivu, nelze jej komprimovat. Budete muset bunzip2
komprimovaný archiv, takže zůstane standardní tarball. Poté můžete použít tar
schopnost přidávat soubory do existujícího archivu a poté znovu komprimovat pomocí bzip2
.
Z návodu:
-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.
Druhá odpověď je správná:nemůžete správně aktualizovat komprimovaný archiv tar, aniž byste jej rozbalili. Dokumentace GNU tar to naznačuje a pokus o aktualizaci selže s explicitní chybovou zprávou:
$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now
Nicméně pokud byste měli zájem o řešení typu špinavé práce, které nevyžaduje dekompresi, mohu vám ji poskytnout na základě následujících pozorování:
- Připojování streamů bzip2 pomocí
cat
je podporován a vytváří platný proud bzip2 (totéž platí pro gzip); - připojování dehtů pomocí
cat
nevytváří platný soubor tar, proto--concatenate
možnost existuje, ale můžeme požádat tar, aby předstíral, že je platný:
Může se vám zdát intuitivnější chtít nebo zkusit použít cat ke spojení dvou archivů namísto použití
--concatenate
úkon; koneckonců cat je nástroj pro kombinování souborů.Archivy tar však obsahují značku konce souboru, která musí být odstraněna, pokud mají být zřetězené archivy správně načteny jako jeden archiv.
--concatenate
odstraní značku konce archivu z cílového archivu před připojením každého nového archivu. Pokud ke spojení archivů použijete cat, výsledkem nebude platný archiv ve formátu tar. Pokud potřebujete načíst soubory z archivu, který byl přidán pomocí nástroje cat, použijte--ignore-zeros
(-i
).
Na základě těchto znalostí můžeme udělat například:
cat {one,two}.tar.bz2 >combined.tar.bz2
Výsledkem je, jak vysvětluje fragment dokumentace výše, neplatný soubor tar, ale s použitím --ignore-zeros
, lze jej stále plně číst:
## 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
Všimněte si, jak výše uvádí seznam všech tří souborů z původních dvou archivů, zatímco vynechává -i
(správně) uvádí pouze soubory z prvního původního archivu:
$ tar tf combined.tar.bz2
a
b
Opět to není nic jiného než špinavý trik, ale mohl by být užitečný, pokud ovládáte zápis i čtení a můžete se ujistit, že -i
bude použito při pokusu o čtení ze souborů vytvořených tímto způsobem.