У меня довольно странная проблема, и я не могу понять, что происходит. У меня есть файл tgz, scip-3.2.0.tgz , который выдает ошибку при попытке распаковать его. Ошибка происходит только на OS X (я на 10.10.4). Я могу извлечь файл без ошибок на Linux-машине под управлением CentOS 6.6. Ошибка возникает как при использовании командной строки, так tar
и при использовании утилиты архивирования. Я отправил по электронной почте список рассылки SCIP, и у меня тот же хэш SHA-1, что и у другого пользователя ( e085a4a3591eddf945dcb365d97d2512c267e374
), поэтому не было ошибки загрузки. Они не уверены, что происходит.
Вот ошибка, которую я получаю при попытке распаковать с помощью утилиты архивирования:
В случае, если изображение когда-либо будет повреждено, текст на изображении говорит это:
Невозможно развернуть "scip-3.2.0.tgz" в "Рабочий стол".
(Ошибка 1 - операция не разрешена.)
И когда я пытаюсь распаковать через командную строку, это вывод, который я получаю . Это последняя строка ( tar: Error exit delayed from previous errors.
), которая касается меня. Я не понимаю, что вызывает это. Архив, кажется, извлекается без проблем, но я не доверяю ему с этой ошибкой.
Кто-нибудь знает, что вызывает это?
[править]
Посмотрев немного ближе к выводу, строка 1108 содержит ошибку:
x scip-3.2.0/applications/Coloring/Makefile: Can't create 'scip-3.2.0/applications/Coloring/Makefile'
tar
команде, которая идет с OS X.gunzip -c scip-3.2.0.tgz | tar xopf -
из командной строки, как вы бы использовали ее для сценария?gunzip
работает просто отлично, но когда я пытаюсь извлечь несжатый архив, возникает ошибка.Ответы:
Это должно помочь определить, что происходит в ответе Джонни , а также ответить на вопрос, почему это работает в Linux, но не в Mac.
Проблема заключается в том, что Mac OS X использует
bsdtar
, в то время как большинство систем Linux используютgnutar
.Вы можете установить
gnutar
на Mac с Homebrew, используяbrew install gnu-tar
, который будет символическая ссылкаgnutar
в/usr/local/bin
качествоgtar
.Если вы установили
gnutar
, то вы можете воспроизвести проблему, используя шаги в ответе Джонни .Очевидно, что все
gnutar
архивируется по-разному, что приводитbsdtar
к удушению дубликатов. Факт, которыйgtar -ztvf test.tar.gz
указывает на то, что второй экземплярtest/a
архивируется как a,link to test/a
имеет значение. Как отмечает Джонни в комментариях,gnutar
дубликаты будут храниться в виде жестких ссылок, а не фактического файла, который можно отключить с помощью--hard-dereference
.То есть вы могли бы сделать следующее:
Однако в этом случае вы явно не контролируете создание архива, так что
--hard-dereference
это не вариант. К счастью, основываясь на ответе OP , кажется, что эта проблема была исправлена апстримом.Тем не менее, если кто-то еще столкнется с этой проблемой в будущем и нуждается в быстром устранении проблемы или у него не отвечает администратор восходящего потока, существует обходной путь.
Как только вы определите, что такое дубликат файла, вы можете использовать
--fast-read
опциюbsdtar
(обратите внимание, что эта опция только частьbsdtar
, а неgnutar
):Так, в примере игрушек , который я создал , следуя примеру игрушек в ответ Джонни , дубликат файла
test/a
. Таким образом, вы можете избежать этой проблемы, выполнив следующие действия:Кроме того, обратите внимание, что он
gnutar
очень рад распаковать архив с дубликатами, которые были созданы самим собой, даже если этот--hard-dereference
параметр не использовался:Так что это отвечает на ваш вопрос о том, почему выдается ошибка на Mac, но не на Linux. (Большинство) дистрибутивов Linux поставляются вместе
gnutar
, и, поскольку, по-видимому, пакет был упакованgnutar
, при распаковкеgnutar
не будет ошибки, но при распаковке будет ошибкаbsdtar
.Для дальнейшего чтения и ссылки, возможно, стоит взглянуть на различия между bsdtar и GNU tar? на Unix.SE.
источник
gtar -tcvf
, gnutar достаточно «умен», чтобы оптимизировать второй файл копии как ссылку, а не дублировать его в архиве.--hard-dereference
опции gtar отключает это поведение.Наличие дубликата файла в архиве не должно делать его недействительным или невозможным для извлечения в OSX, так как по умолчанию tar перезаписывает дубликаты.
Итак, я немного смущен поведение в вашем Gist - OSX деготь позволяет дубликаты файлов в архиве (возврат к первоначальной цели в виде т обезьяна ар зубчика утилиты, так что это позволяет файлы , которые будут добавляться в конце архив ленты, и при восстановлении архива самая новая версия файла перезапишет старую версию (и))
Только когда указана опция -k, tar должен предупреждать о существующих файлах.
Здесь я создал архив с дубликатом файла, а затем извлек его без проблем. Только когда я добавил параметр -k, он предупредил меня о дубликате файла:
Простая проблема с umask тоже не кажется виновной, я попытался изменить свой umask на 0777, и я все еще могу извлечь архив:
Я подумал, что смогу продублировать проблему, сознательно добавив в архив незаписываемый каталог, но это не сработало, tar не обновил разрешения для каталога при извлечении архива:
Я также попытался изменить разрешения для test / a на 000, добавить его в архив, а затем добавить еще один test / a, но он тоже работал нормально:
Поэтому мне бы очень хотелось увидеть оригинальный архив, вызвавший проблему, и посмотреть, что могло быть в этом архиве, чтобы вызвать эту проблему.
Если имя файла и каталога имеют одно и то же имя, у tar действительно есть проблема с извлечением, но у него довольно четкое сообщение об ошибке:
(если конфликт произошел наоборот, то есть файл появился первым, то каталог с таким же именем появился позже, tar просто удаляет его и создает каталог:
источник
Оказывается, утилита OS X tar была правильной! В архиве действительно была ошибка. Эта ветка электронной почты обсуждает это более подробно, но проблема в том, что в архиве есть дубликат файла . Ребята из SCIP исправляют архив, когда я это печатаю.
[edit]
Недавно обновленный scip-3.2.0.tgz теперь распаковывается просто отлично! Хэш SHA-1 нового tgz
5b4e8283f4a5bf9e50f9a62d4320d6f5f50c8476
.[править 2]
Дело не в том, что в архиве есть ошибка. Это просто то
bsdtar
, что поставляется с OS X, обрабатывает дубликаты файлов иначе, чем вgnutar
Linux. Ответ Адама Литера здесь дает подробное объяснение того, что происходит.источник
-k
опцию, которая предупреждала бы о существующих файлах. К сожалению, они уже обновилиscip-3.2.0.tgz
файл, чтобы удалить дубли, поэтому я не могу проверить этот архив.tar
Экстракт по- разному реагирует на попытку извлечьscip-3.2.0/applications/Coloring/Makefile
два раза в зависимости от вашегоumask
. Если 1-й созданный не оставляет вам права на запись, 2-я попытка не удалась.Есть альтернативное, бесплатное, легкое архивное программное обеспечение, которое я использую для Mac OSX. Он называется Keka, и я использую его для распаковки 7zip наиболее конкретно. Более того, он может распаковывать другие типы, такие как .rar, .tar, .gz и т. Д. Он также работал для конкретного tar-файла OP, но я попытался сделать это после того, как @Geoff упомянул, что команда работает над исправлением файла.
источник