Этот вопрос довольно старый, но я бы хотел, чтобы мне было легче найти следующую информацию раньше. Так что, если кто-то еще сталкивается с этим, наслаждайтесь:
То, что Джефф описывает выше, является известной ошибкой в gnu tar (сообщается в августе 2008 года). Только первый архив (после параметра -f
) удаляет маркер EOF. Если вы попытаетесь объединить более двух архивов, последние архивы будут "спрятаны" за маркерами конца файла.
Это ошибка в tar. Он объединяет целые архивы, включая завершающие нулевые блоки, поэтому по умолчанию чтение результирующего архива прекращается после первой конкатенации.
Источник: https://lists.gnu.org/archive/html/bug-tar/2008-08/msg00002.html (и следующие сообщения)
Учитывая возраст ошибки, мне интересно, будет ли она когда-нибудь исправлена. Я сомневаюсь, что есть критическая масса, которая затронута.
Лучший способ обойти эту ошибку - использовать опцию -i
, по крайней мере, для файлов .tar в вашей файловой системе.
Как указывает Джефф, tar --concatenate
может занять много времени, чтобы достичь EOF, прежде чем он объединит следующий архив. Так что, если вы собираетесь застрять в "сломанном" архиве, для которого требуется опция tar -i
чтобы распаковать, я предлагаю следующее:
Вместо использования tar --concatenate -f archive1.tar archive2.tar archive3.tar
вам, вероятно, будет лучше запустить cat archive2.tar archive3.tar >> archive1.tar
или pipe к dd
если вы собираетесь записывать на ленту устройство.
Также обратите внимание, что это может привести к неожиданному поведению, если ленты не обнулялись до (пере) записи новых данных на них. По этой причине в моей заявке я буду использовать вложенные тары, как это предлагается в комментариях под вопросом.
Приведенное выше предложение основано на следующем очень небольшом выборочном тесте:
time tar --concatenate -vf buffer.100025.tar buffer.100026.tar
real 65m33.524s
user 0m7.324s
sys 2m50.399s
time cat buffer.100027.tar >> buffer.100028.tar
real 46m34.101s
user 0m0.853s
sys 1m46.133s
Буфер.* Файлы .tar имеют размер 100 ГБ, система практически не работала, за исключением каждого из вызовов. Разница во времени достаточно значительна, так что я лично считаю этот тест действительным, несмотря на небольшой размер выборки, но вы можете сами сделать это и, вероятно, лучше всего выполнить такой тест на своем оборудовании.