95

Когда я сохраняю файлы на своем Macbook и распаковываю их в Linux, я постоянно получаю следующие предупреждения / ошибки:


 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Error exit delayed from previous errors

К счастью, это НЕ влияет на файлы, хранящиеся в архиве, которые прекрасно восстанавливаются. Однако это вызывает проблемы в ряде сценариев, особенно при работе с процессами сборки, где ненулевой код ошибки, возвращаемый tar, вызывает ненужную остановку сборки и установки.

Как я могу заставить OS X создавать tar-файлы, которые хорошо сочетаются с остальным миром Linux?

Кроме того, для бонусных баллов существует общедоступный tar-файл с этими проблемами. Есть ли способ заставить Linux обрабатывать tar-файл изящно, не меняя способа, которым он был изначально сжат?

10 ответов10

65

Я погуглил сообщение об ошибке, и это похоже на проблему tar с BSD или с GNU tar .

Установите GNU tar если можете, на Mac OS и используйте его для создания tar .

56

Если вы используете Mavericks или новее, то gnutar больше не включается по умолчанию.

Обходной путь, если вы используете homebrew, заключается в следующем:

brew install gnu-tar

Затем вы можете использовать команду gtar для совместимости с Linux.


Если вы хотите заменить tar на gtar , просто замените символическую ссылку

tar --version
ll `which tar`
sudo unlink `which tar`
sudo ln -s `which gtar` /usr/bin/tar
tar --version

Чтобы восстановить исходный tar- файл, поставляемый с Mac Os X, выполните приведенные выше команды, но замените which gtar which bsdtar

Источник:
https://github.com/jordansissel/fpm/issues/576

24

Tar GNU не нравится некоторая дополнительная информация, которую включает в себя tar OSX BSD.

GNU tar позволит вам подавить эти предупреждения с помощью опции:

--warning=no-unknown-keyword

См .: https://www.gnu.org/software/tar/manual/html_section/tar_27.html.

Обратите внимание, что tar BSD не поддерживает этот флаг, поэтому, если вам нужно запустить один и тот же код распаковки на всех платформах, вы можете использовать что-то вроде:

isGnuTar=$(tar --version | grep -q 'gnu')
if [ $? -eq 0 ]
then
    echo "Detected GNU tar"
    tar --warning=no-unknown-keyword -zxf my.tar.gz
else
    tar -zxf my.tar.gz
fi
10

Чтобы правильно извлечь файл tar без ошибок в системе Linux, вы можете использовать bsdtar.

sudo apt-get install bsdtar

Тогда используйте как обычно.

bsdtar -xvf file.tar где file.tar - это файл tar, который вы хотите извлечь.

Источник: https://bugs.launchpad.net/ubuntu/+source/tar/+bug/129314

В качестве альтернативы вы также можете использовать файловый ролик GNOME.

5
COPYFILE_DISABLE=1 tar cf filename.tar

или же

tar --disable-copyfile cf filename.tar

Это наименее обнаруживаемая особенность tar в OS X, о которой я лично знаю.

См. Также Почему я получаю файлы типа ._foo в моем архиве на OS X?


Редактировать: похоже, что это может только остановить создание нежелательных файлов ._foo , но не остановить создание заголовка (по крайней мере, в Yosemite/10.10); спасибо комментаторам за указание на это. Однако (для бонусных баллов :) вы можете изящно обрабатывать такие тарболы, извлекая их следующим образом:

tar xf filename.tar --pax-option=delete=SCHILY.*,delete=LIBARCHIVE.*

Это работало с использованием gnu tar 1.15.1, который довольно старый! В качестве альтернативы вы можете использовать вместо этого pax, который (для меня) выбрасывает дополнительную информацию в каталог PaxHeader , но, по крайней мере, завершается без ошибок:

pax -rf filename.tar
4

MacOSX уже поставляется с Gnutar. Если вы хотите быстрое и грязное решение, добавьте это в ~/.bash_profile

alias tar='gnutar'

и запустите source ~/.bash_profile для обновления

Кроме того, OSX поставляется с GNU и BSD tar. Таким образом, вы также можете отменить ссылку на tar с bsd на gnu:

sudo unlink /usr/bin/tar;
sudo ln -s /usr/bin/gnutar /usr/bin/tar
2

Спасибо. Эта тема была очень полезной. Если вы используете MacPorts, вот краткое руководство:

sudo port install gnutar

sudo ln -s /usr/local/opt/gnu-tar/libexec/gnubin/tar /usr/bin/gnutar

sudo ln -s /opt/local/libexec/gnubin/tar /usr/bin/gnutar

Добавьте следующую строку в /Users/[yourname]/.profile

alias tar='/opt/local/libexec/gnubin/tar'

Закройте и перезапустите окно терминала.

1

Да, встроенный в Mac двоичный файл tar добавляет кучу дополнительных вещей, которые CentOS не любит. Чтобы это исправить, сделайте следующее:

sudo mv /usr/bin/tar /usr/bin/darwintar
sudo ln -s /usr/bin/gnutar /usr/bin/tar
ls -l /usr/bin/tar

Надеюсь, это поможет!

0

Хорошо, я использовал поиск в Google, но верхняя тройка ссылок подтвердила то, что я подозревал

  1. Ошибка в вашем смоле И / ИЛИ
  2. Несовместимость двух утилит tar
    Смотрите эту ссылку. Там кто-то сообщает, что "Использование" bsdtar -xvf "работает".

Редактировать: Вы находитесь в системе Mac, я думал наоборот. Вам нужно будет использовать gnutar, он должен быть уже установлен, если не установлен. Конечно, вы можете посмотреть на другие ссылки, ища себя.

0

На MAC OSX установите GNU-tar

brew install gnu-tar

затем создайте свой Linux-совместимый tar с помощью:

gtar -c -f your_tar_file files

Или вы можете создать свой архив в формате pax

tar -c --format pax -f your_tar_file files

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .