Несумісність версій Linux / OS X - архіви, створені на OS X, дають помилки, коли вони не використовуються в Linux


94

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

Відповіді:


65

Я користувався послугами Google для повідомлення про помилку, і здається, що це BSD tar проти GNU tar проблема.

Встановіть GNU tar якщо ви можете на Mac OS і використовувати, щоб створити tar.


16
У Mac OS X 10.6 за замовчуванням використовується tar-код BSD, а також постачається з gnutar /usr/bin/gnutar.

@Ned. Дякую. це хороша інформація.
Dave Dopson

12
FYI: / usr / bin / gnutar більше не постачається з Mac OS X (принаймні, як на Mavericks)
foobar

sudo port встановити gnutar cd / usr / bin sudo rm tar судо ln -s / opt / local / bin / gnutar tar
chaosless

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

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


2
Немає необхідності більше роз'єднувати, як засвідчує пиво, ви можете просто додати це до вашого PATH в .bashrc (або еквівалент): PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
Bryan Petty

1
Або просто створіть a tar посилання в /usr/local/bin від cd /usr/local/bin ; ln -s gtar tar - можливо, найпростіший варіант
Karthik T

24

GNU tar не сподобався деякій необов'язковій інформації, до якої входить BSD tar OSX за замовчуванням.

GNU tar дозволить вам придушити ці попередження за допомогою параметра:

--warning=no-unknown-keyword

Подивитися: https://www.gnu.org/software/tar/manual/html_section/tar_27.html

Зауважте, що BSD tar не підтримує цей прапор, тому, якщо вам потрібно запустити той самий розпаковуючий код на всіх платформах, можна використовувати щось подібне:

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

4
це повинна бути правильна відповідь, оскільки вона не передбачає встановлення абсолютно нового інструменту задля придушення єдиного попередження.
c z

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); завдяки commenters для того, щоб вказувати це. Проте (за бонусні бали :) ви можете граціозно обробляти такі архіви, витягаючи їх так:

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

Це спрацювало, використовуючи gnu tar 1.15.1, який досить старий! Крім того, ви можете використовувати pax замість цього, який (для мене) кидає додаткову інформацію в a PaxHeader каталог, але принаймні виходити без помилки:

pax -rf filename.tar

На жаль, це не зупиняє розширені попередження про ключові слова під час видалення з gnutar.
JJC

Жоден з них не працює на Yosemite ( tar --version позначає bsdtar 2.8.3 - libarchive 2.8.3 ). Також мені потрібен дефіс раніше cf в останньому випадку.
tripleee

3

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
Dave Dopson

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/[именоме./профілі

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

Вийдіть і перезапустіть вікно терміналу.


1

Так, вбудований в бінарний модуль Mac додає купу додаткових матеріалів, яких не подобається 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 vs Mac і якщо встановлена ​​змінна середовища COREUTILS
Dave Dopson

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

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

0

Гаразд, я використовував пошук Google, але перші три посилання підтвердили те, що я підозрював

  1. Помилка у вашому tar / / OR
  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.