web-dev-qa-db-ja.com

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

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ファイルを適切に処理する方法はありますかwithout元の圧縮方法を変更しますか?

103
Dave Dopson

私はエラーメッセージについてグーグルしました、そしてそれはBSD tar vs. GNU tar問題のようです。

Mac OS上で可能な場合はGNU tarをインストールし、それを使用してtarを作成します。

67
holygeek

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

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

brew install gnu-tar

そうすると、Linux互換性のためにコマンドgtarを使うことができます。


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

57
spuder

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
26
Chris

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

Sudo apt-get install bsdtar

それから通常通りに使ってください。

bsdtar -xvf file.tarここでfile.tarは抽出したいtarファイルです。

出典:https://bugs.launchpad.net/ubuntu/+source/tar /+bug/129314

あるいは、GNOMEファイルローラーを使用することもできます。

10
daka
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を適切に抽出することで、そのようなtarballを適切に処理できます。

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

これはかなり古いgnu tar 1.15.1を使ってうまくいきました!別の方法として、代わりにpaxを使用することもできます。これは(私にとっては)余分な情報をPaxHeaderディレクトリに入れますが、少なくともエラーなしで終了します。

pax -rf filename.tar
5
Zac Thompson

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
4
Du3

ありがとうございました。このスレッドはとても役に立ちました。あなたが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'

元に戻して、ターミナルウィンドウを再起動します。

2
howdytom

そう、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

それが役立つことを願っています!

1
Shaheen Ghiassy

さて、私はグーグル検索を使いました、しかしトップ3のリンクは私が疑ったことを確認しました

  1. あなたのタールのバグおよび/または
  2. 2つのtarユーティリティ間の非互換性
    このリンクを参照してください。 「Using "bsdtar -xvf"がうまくいった」との報告もあります。

編集:あなたはMacシステム上にいます、私は逆に考えました。 gnutarを使う必要があるでしょう。インストールされていなければ、すでにインストールされているはずです。もちろん、自分で検索して他のリンクを調べることもできます。

0
Sudhi

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
0
msadek