Я ищу способ обновить тысячи архивных файлов .tbz, поэтому я буду делать это с помощью сценария оболочки. Мне нужно добавить один файл к каждому.
Мой вопрос: есть ли более быстрый способ сделать это, не извлекая содержимое каждого tbz, а затем повторно сжимая его с новым файлом, включенным в содержащийся tar? Как будут выглядеть команды?
Спасибо
linux
shell-script
shell
command-line
tar
BottleZero
источник
источник
Ответы:
Хотя
tar
можно добавлять файлы в уже существующий архив, его нельзя сжать. Вам придётсяbunzip2
сжать архив, оставив стандартный тарбол. Затем вы можете использоватьtar
возможность добавлять файлы в существующий архив, а затем повторно сжиматьbzip2
.Из руководства:
источник
Другой ответ правильный: вы не можете правильно обновить сжатый tar-архив, не распаковывая его. В документации GNU tar на это намекает, и попытка обновления завершается неудачно с явным сообщением об ошибке:
Однако, если вас заинтересует грязное решение, не требующее распаковки, я могу предложить его на основе следующих наблюдений:
cat
Поддерживается добавление потоков bzip2 с использованием и создает действительный поток bzip2 (то же самое относится и к gzip);cat
tar не дает действительный файл tar, поэтому--concatenate
опция существует, но мы можем попросить tar сделать вид, что она действительна:На основании этих знаний мы можем сделать, например:
Это приводит, как объясняет приведенный выше фрагмент документации, к неверному файлу tar, но при использовании
--ignore-zeros
его все равно можно прочитать полностью:Обратите внимание, что в приведенном выше списке перечислены все три файла из двух исходных архивов, тогда как при пропуске
-i
(правильно) перечислены только файлы из первого исходного архива:Еще раз, это не более чем грязная уловка, но она может быть полезна, если вы контролируете обе стороны записи и чтения и можете убедиться, что
-i
это будет использоваться при попытке чтения из файлов, созданных таким образом.источник
i
его в командную строку, увидят все это.