Linux / OS X tarの非互換性-Linuxでtarを展開すると、OS Xで作成されたtarballでエラーが発生します


106

Macbookでファイルをtarし、Linuxでuntarすると、次の警告/エラーが繰り返し表示されます。


 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に、他のLinuxの世界でうまく動作するtarファイルを作成させるにはどうすればよいですか?

また、ボーナスポイントには、これらの問題を含む公的に配布されたtarファイルが存在します。最初に圧縮された方法変更せずに、Linuxでtarファイルを適切に処理する方法はありますか?

回答:


71

エラーメッセージをGoogleで検索したところ、BSD tarとGNUのtar問題のようです。

tarMac OSで可能な場合はGNUをインストールし、それを使用してtar


17
Mac OS X 10.6はデフォルトでBSD tarを使用しますが、gnutarが付属しています/usr/bin/gnutar

@ネッド。どうも。それは良い情報です。
デイブドップソン

15
参考までに/ usr / bin / gnutarはMac OS Xに同梱されなくなりました(少なくともMavericks時点)
foob​​ar

sudoポートインストールgnutar cd / usr / bin sudo rm tar sudo ln -s / opt / local / bin / gnutar tar
chaosless 14年

MacPortsを使用している場合は、/ usr / binから何かを削除したり、シンボリックリンクを手動で作成したりするのではなく、PATHの先頭に/ opt / local / libexec / gnubin /を置くこともできます。
ロリン

62

Mavericks以降を使用している場合、gnutarはデフォルトで含まれなくなりました。

homebrewを使用する場合の回避策は、次を実行することです。

brew install gnu-tar

その後gtar、Linux互換性のためにコマンドを使用できます。


置換したい場合targtarは、単にシンボリックリンクを置き換えます

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

Mac Os Xで提供される元のtarを復元するには、上記のコマンドを実行しますがwhich gtarwhich bsdtar

ソース:https :
//github.com/jordansissel/fpm/issues/576


4
必要はありません、もう解除しないように醸造を指示して、あなただけであなたのPATHにこれを追加することができます.bashrc(または、あなたの同等品):PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
ブライアン・ペティ

1
それとも、作成tar中のリンクを/usr/local/binすることによりcd /usr/local/bin ; ln -s gtar tar、おそらく最も簡単なオプション-
カルティクT

27

GNU tarは、デフォルトのOSX BSD tarに含まれるオプション情報の一部が好きではありません。

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

5
単一の警告を抑制するためにまったく新しいツールをインストールする必要がないため、これは正しい答えです。
cz

10

Linuxシステムでエラーなしでtarファイルを適切に抽出するには、bsdtarを使用できます。

sudo apt-get install bsdtar

その後、通常どおり使用します。

bsdtar -xvf file.tarfile.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

これは、私が個人的に知っているOS Xでのtarの最も発見されにくい機能です。

参照してください、私はOS X上で私のtarballに._fooのようなファイルを取得なぜ?


編集:これは、不要な._foo-typeファイルの作成を停止するだけで、ヘッダーの作成を停止しないように見えます(少なくともYosemite / 10.10では)。それを指摘してくれたコメンターに感謝します。ただし、(ボーナスポイントの場合:)次のように展開することにより、このようなtarballを適切に処理できます。

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、後者の場合は前にダッシュが必要です。
トリプリー

4

MacOSXにはすでにgnutarが付属しています。迅速で汚れたソリューションが必要な場合は、これを~/.bash_profile

alias tar='gnutar'

実行source ~/.bash_profileして更新する

さらに、OSXにはGNU tarと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

お役に立てば幸いです!


それが一つの方法です。github.com/ddopson/dotfilesで GNU / BSDの問題をより包括的に解決しました。パスの初期に〜/ bin / coreutilsがあり、そこにgithub.com/ddopson/dotfiles/blob/master/bin/coreutils/tarのような小さなシムがあり、Linux vs Macに基づいて正しい実行可能ファイルを選択し、COREUTILS環境の場合変数が設定されています
デイブドップソン

作業tarを移動する前に、/ usr / bin / gnutarの存在を確認するように指示するように、指示を変更することをお勧めします。初心者はGoogleを使用してこれを見つけることができ、システムを解除する方法がわかりません。
msouth

いくつかの理由から、これはおそらく良い考えではありません。1)Appleパッケージは、ネイティブのtar(Appleファイル属性の処理方法を知っているtar)の場所を知りません。2)GNU tarを使用する必要がある場合は、/ usr / local / binなどのように、検索パスの先頭に置く必要があります。3)tarソフトウェアを混乱させないために、外部プログラムgnutarを呼び出すことはおそらく安全です。 MacがMacのように振る舞うことを期待しています。0.02ドル。-Erik
エリック・ベネット

0

さて、Google検索を使用しましたが、トップ3のリンクは私が疑ったことを確認しました

  1. タールのバグAND / OR
  2. 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.