Другой ответ правильный: вы не можете правильно обновить сжатый tar-архив, не распаковывая его. В документации GNU tar на это намекает, и попытка обновления завершается неудачно с явным сообщением об ошибке:
$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now
Однако, если вас заинтересует грязное решение, не требующее распаковки, я могу предложить его на основе следующих наблюдений:
cat
Поддерживается добавление потоков bzip2 с использованием и создает действительный поток bzip2 (то же самое относится и к gzip);
- добавление команды
cat
tar не дает действительный файл tar, поэтому --concatenate
опция существует, но мы можем попросить tar сделать вид, что она действительна:
Вам может показаться более интуитивным желание или попытка использовать cat для объединения двух архивов вместо использования --concatenate
операции; В конце концов, cat - это утилита для объединения файлов.
Тем не менее, архивы tar содержат маркер конца файла, который необходимо удалить, если объединенные архивы должны быть правильно прочитаны как один архив. --concatenate
удаляет маркер конца архива из целевого архива перед добавлением каждого нового архива. Если вы используете cat для объединения архивов, результатом будет неправильный архив формата tar. Если вам нужно извлечь файлы из архива, который был добавлен в утилиту cat, используйте опцию --ignore-zeros
( -i
).
На основании этих знаний мы можем сделать, например:
cat {one,two}.tar.bz2 >combined.tar.bz2
Это приводит, как объясняет приведенный выше фрагмент документации, к неверному файлу tar, но при использовании --ignore-zeros
его все равно можно прочитать полностью:
## 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
Обратите внимание, что в приведенном выше списке перечислены все три файла из двух исходных архивов, тогда как при пропуске -i
(правильно) перечислены только файлы из первого исходного архива:
$ tar tf combined.tar.bz2
a
b
Еще раз, это не более чем грязная уловка, но она может быть полезна, если вы контролируете обе стороны записи и чтения и можете убедиться, что -i
это будет использоваться при попытке чтения из файлов, созданных таким образом.