Несовместимость tar в Linux / OS X - tarballs, созданные в OS X, выдают ошибки, когда их нет в Linux


106

Когда я сохраняю файлы на своем 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-файл изящно, не меняя способа, которым он был изначально сжат?

Ответы:


71

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

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


17
Mac OS X 10.6 по умолчанию использует tar BSD, но также поставляется с гнутаром /usr/bin/gnutar.

@Ned. Спасибо. это хорошая информация
Дейв Допсон

15
К вашему сведению: / usr / bin / gnutar больше не поставляется с Mac OS X (по крайней мере, с Mavericks)
foobar

sudo port install gnutar cd / usr / bin sudo rm tar sudo ln -s / opt / local / bin / gnutar tar
хаоса

Если вы используете MacPorts, вы также можете просто поместить / opt / local / libexec / gnubin / в верхнюю часть вашей переменной PATH, а не удалять что-либо из / usr / bin или вручную создавать символические ссылки.
Лоррин

62

Если вы используете 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


4
Больше не нужно отсоединять, как говорит brew, вы можете просто добавить это к своему PATH в .bashrc(или вашем эквиваленте):PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
Bryan Petty

1
Или просто создать tarссылку в /usr/local/binпо cd /usr/local/bin ; ln -s gtar tar- возможно , самый простой вариант
Картик T

27

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

5
Это должен быть правильный ответ, поскольку он не предусматривает установку совершенно нового инструмента для подавления одного предупреждения.
CZ

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.


6
COPYFILE_DISABLE=1 tar cf filename.tar

или же

tar --disable-copyfile cf filename.tar

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

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


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

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

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

pax -rf filename.tar

К сожалению, это не останавливает предупреждения о ключевом слове расширенного заголовка, когда вы не используете gnutar.
JJC

Похоже, что ни один из них не работает на Йосемити ( tar --versionуказывает bsdtar 2.8.3 - libarchive 2.8.3). Кроме того, мне нужно тире, прежде чем cfв последнем случае.
tripleee

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

1
Почему в /etc/hosts? /etc/hostsдля отображения хоста / IP, верно?
BenjiWiebe

1
что сказал @BenjiWiebe. Чётный бит редактирует / etc / hosts. Я думаю, что вы имели в виду ~ / .bashrc
Дейв Допсон

2
На OS X .bashrcне загружается для сеансов терминала. Вам нужно .bash_profile, поскольку оболочка входа в систему запускается с новым окном терминала. / cc @BenjiWiebe
slhck

Правильно :-) В то время я также работал в / etc / hosts, поэтому он вылетал на клавиатуру. Хороший улов
Du3

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

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


Это один из способов. Я решил проблему GNU / BSD более подробно в github.com/ddopson/dotfiles . У меня есть ~ / bin / coreutils в начале пути, и там есть небольшие шайбы, такие как github.com/ddopson/dotfiles/blob/master/bin/coreutils/tar, которые выбирают правильный исполняемый файл на основе Linux против Mac и, если среда COREUTILS переменная установлена
Дейв Допсон

Возможно, вы захотите изменить свои инструкции, чтобы люди могли проверить наличие / usr / bin / gnutar, прежде чем перемещать свой рабочий tar. Новички могут найти это с помощью Google и не знают, как взломать их систему.
августа

Это, вероятно, не очень хорошая идея, по нескольким причинам. 1) Теперь пакеты Apple не знают, где найти собственный tar, который знает, как обрабатывать атрибуты файлов Apple. 2) Если вы должны использовать GNU tar, правильное место, чтобы поместить его впереди в вашем пути поиска, например / usr / local / bin, или что-то в этом роде, и 3) Возможно, еще безопаснее вызывать tarстороннюю программу gnutar, чтобы избежать путаницы в программном обеспечении. ожидая, что Mac будет вести себя как Mac. $ 0,02. -Эрик
Эрик Беннетт

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.