Вопрос или проблема
Я пытался распаковать файл .tar.gz
, но столкнулся с такой ошибкой:
gzip: stdin: unexpected end of file
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
Файл tar.gz
включает файл .tar
, который при распаковке дает:
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
Я пробовал и –ignore-zeros
, и –ignore-failed-read
, но ничего не сработало.
Есть ли способ извлечь этот файл, даже если он поврежден?
Тип файла: .tar.gz
: Gzip Сжатые данные, из UNIX системы.
Проверьте два момента:
(1) ЯВЛЯЕТСЯ ЛИ ФАЙЛ НЕПОЛНЫМ из-за сбоя при загрузке? Перекачайте его и используйте опцию -c, если используете wget. (случается постоянно).
(2) Содержит ли имя файла .tar или .tar.gz НЕДОПУСТИМЫЕ СИМВОЛЫ? Лучше чтобы имена архивов были простыми, короткими, состоящими из букв и цифр. (случается постоянно). Просто переименуйте файл. Меня это недавно подвело, когда я решил включить временную метку как часть имени архива. ПЛОХАЯ ИДЕЯ!
Нет. Похоже, что файл был усечен. Какова его длина? Если у вас есть только первые несколько байт, то это все.
Вы распаковываете файл .tar.gz на той же платформе, на которой он был создан? Существуют некоторые различия между более старыми версиями tar для Unix, такими как не-GNU версиями tar, которые поставляются с Solaris, и GNU tar, которая поставляется с Linux, и т.д. Если вы собираетесь распаковать архив с помощью GNU tar, то лучше всего создавать его с помощью GNU tar.
Как обстоят дела с дисковым пространством? Был ли диск заполнен, когда вы создавали архив, или он заполнен, когда вы пытаетесь его распаковать?
Вы создавали архив с помощью cron задания? Без перенаправления вывода cron может совершать странные вещи с архивами из-за ограничений на размер вывода, который он позволяет на STDOUT. Если вы создаете архив в cron и используете -v
с tar
, попробуйте перенаправить STDOUT в файл, а также и STDERR. Посмотрите, поможет ли это. Например: tar -cvf archive.tar.gz /path/ 1>archive.stdout.log 2>archive.stderr.log
или что-то в этом духе.
У меня была такая же ошибка.
Моя проблема заключалась в попытке использовать tar
для распаковки до завершения загрузки.
Совсем недавно столкнулся с этой проблемой, решением было переименовать файл (удалив _
). Например, плохое имя файла, которое вызывало проблему: MAA07-0100-0100-01AAA_show_tech_output.tgz
. Переименование его в MAA07-0100-0100-01AAA.tgz
помогло решить проблему.
Моя проблема заключалась в том, что я хранил tar файлы в git, и, видимо, git не очень хорошо работает с большими двоичными данными. Это работало нормально какое-то время, но в конечном итоге приводило к их повреждению.
Моя проблема заключалась в том, что архив tar был сжат с использованием lz4, поэтому мне нужно было сначала:
lz4 -d base-snapshot.tar.lz4 base-snapshot.tar
Моим решением проблемы было дважды переименовать архив tar. Это звучит нелепо, но это сработало для меня и сэкономило много времени на пересоздание архива.
У меня был большой архив tar gzip объемом 9 ГБ, названный ‘STRING152_20200221.tar.gz’, который выдавал ошибки, указанные автором вопроса.
Как советовали выше, я переименовал его просто в ‘STRING.tar.gz’. Ошибки сохранялись.
Затем я переименовал его обратно в исходное название ‘STRING152_20200221.tar.gz’, и он успешно распаковался.
Никаких манипуляций с архивом, кроме изменения его имени, сделано не было.
Моя версия tar — ‘tar (GNU tar) 1.26’. Я также на CentOs (CentOS Linux release 7.4.1708 (Core))
.
Ответ или решение
Ошибка "tar: Unexpected EOF in archive" указывает на то, что программа tar обнаружила преждевременный конец архивного файла, чем обычно обозначается повреждение или неполнота архива. Давайте подробно разберем возможные причины и способы их устранения, применяя метод TEA (Theory, Example, Application).
Теория (Theory)
Ошибка может возникнуть по нескольким причинам:
-
Неполная загрузка файла. Часто причиной этой ошибки является неудачная загрузка файла из Интернета, когда файл загружен не полностью. Это может быть вызвано прерыванием соединения или неисправностью сервера.
-
Сбой при создании архива. Если архив создавался на устройстве с недостаточным местом на диске или в процессе создания произошел сбой, то файл может оказаться поврежденным.
-
Проблемы с переносом файлов. Если архив был передан по сети или скопирован с одного устройства на другое и в процессе передачи произошла ошибка, это может повредить файл.
-
Неправильная версия tar. Повреждение архива может быть связано с несовместимостью версий tar: файл был создан одной версией утилиты, а извлекается другой, что иногда вызывает конфликты, особенно между версиями на разных платформах (например, GNU tar и Solaris tar).
-
Проблемы с файловой системой. Если файловая система устройства вышла из строя или находится в непредвиденном состоянии, это может повлиять на целостность архивов.
Примеры (Example)
Рассмотрим несколько примеров, взятых из реальной практики, как описано в вопросе и комментариях:
-
Проблема с недозагрузкой файла: Один из пользователей столкнулся с ошибкой, когда пробовал распаковать архив до завершения его загрузки на сервер.
-
Лишние символы в имени файла: Другой пользователь решил проблему, переименовав файл и убрав символ подчёркивания. Это улучшило совместимость при распаковке.
-
Случай с git-ом: Попытка хранения больших бинарных данных в git вызвала повреждение, так как git плохо справляется с большими бинарными файлами.
Применение (Application)
Теперь рассмотрим, как можно попытаться справиться с данной ошибкой:
-
Проверка полноты файла: Убедитесь, что файл загружен полностью. Попробуйте загрузить его заново, используя надежные инструменты, такие как
wget -c
, который может возобновлять прерывавшиеся загрузки. -
Проверка дискового пространства: Убедитесь, что на устройстве достаточно свободного места для распаковки архива. Недостаток пространства может стать причиной неполноты или повреждения архива.
-
Использование совместимой версии tar: Если архив был создан специфической версией tar на другой платформе (например, GNU tar), попытайтесь создать и извлечь архив с использованием одной и той же версии. Это важно при работе с архивами, созданными на системах Unix или Linux и распаковываемыми на других типах систем.
-
Проверка и исправление ошибок файловой системы: Выполните команду проверки диска, такую как
fsck
на Linux, чтобы убедиться в отсутствии повреждений файловой системы. -
Альтернативные методы извлечения: В случае если стандартные методы не помогают, попробуйте такие инструменты, как
7z
, которые могут предложить больше возможностей при работе с повреждёнными архивами. -
Журналирование ошибок: Если архив создавался с помощью скрипта или cron, перенаправьте вывод и ошибки в файлы логов, чтобы детально изучить любой неудачный процесс создания архива. Это поможет в будущем избежать подобных ошибок.
Применение вышеописанных методов может помочь в решении проблемы "Unexpected EOF in archive" при работе с файлами .tar.gz
. Хотя некоторые случаи требуют простых решений, таких как переименование файла, более сложные проблемы могут потребовать детальной диагностики и исправления корневой причины.