このtgzを抽出すると、LinuxではなくMacでエラーがスローされるのはなぜですか?


27

私はかなり奇妙な問題を経験しており、何が起こっているのか分かりません。tgzファイルscip-3.2.0.tgzがあり、これを解凍しようとするとエラーがスローされます。このエラーはOS Xでのみ発生しています(10.10.4にいます)。CentOS 6.6を実行しているLinuxボックスでエラーなしにファイルを抽出できます。このエラーは、コマンドラインtarコマンドを使用する場合とアーカイブユーティリティを使用する場合の両方で発生します。SCIPメーリングリストにメールを送信しましたが、別のユーザー(e085a4a3591eddf945dcb365d97d2512c267e374)と同じSHA-1ハッシュを持っているため、ダウンロードエラーはありませんでした。彼らは何が起こっているのかわからない。

アーカイブユーティリティを使用して解凍しようとすると、次のエラーが表示されます。

アーカイブユーティリティエラー

画像が破損した場合、画像内のテキストには次のように表示されます。

「scip-3.2.0.tgz」を「Desktop」に展開できません。
(エラー1-操作は許可されていません。)

そして、コマンドラインからアンパックしようとすると、これが出力されますtar: Error exit delayed from previous errors.私に関係する最後の行()です。何が原因なのかわかりません。アーカイブ問題なく抽出されているように見えますが、エラーがスローされることを信じてはいません。

誰がこれを引き起こしているのか知っていますか?

[編集]
出力をもう少し詳しく見ると、1108行目にエラーが含まれています。

x scip-3.2.0/applications/Coloring/Makefile: Can't create 'scip-3.2.0/applications/Coloring/Makefile'

2
アンアーカイバなどの別のアプリで動作しますか?wakaba.c3.cx/s/apps/unarchiver.html
TryTryAgain

はい、そうです!彼らは何を違うようにしているのだろうか。問題の一部は、私がたくさんのことを自動化するbashスクリプトを持っていることです。そして、その中にあるものを構築できるように、このtgzを抽出する必要があります。tarOS Xに付属のコマンドにバグがあるのではないかと思います
。-ジェフ

1
おそらく、バグがあります。OS Xに組み込まれたアーカイブユーティリティは、かなりくだらないことがわかりました。必要なファイルをzipなどに再アーカイブする方法はありませんか?また、スクリプトを作成している場合、スクリプトでgunzip -c scip-3.2.0.tgz | tar xopf -使用するのと同じように、コマンドラインからもエラーが発生しますか?
TryTryAgain

ええ、そのコマンドは同じエラーをスローします。gunzipうまく動作しますが、圧縮されていないtarballを抽出しようとすると、エラーがスローされます。
ジェフ

ああ、実際にはtarballにエラーがありました!私は狂っていませんよ。より詳細な回答を書きます。どうやらOS Xのtarユーティリティはここで正しいものでした!
ジェフ

回答:


32

これは、Johnnyのanswerで何が起きているのかを特定するのに役立ち、MacではなくLinuxでこれが機能する理由の質問に答える必要があります。

問題は、bsdtarほとんどのLinuxシステムが使用するのに対して、Mac OS Xが使用するという事実にありますgnutar

あなたは、インストールすることができますgnutar使用して、自作してMac上でbrew install gnu-tarシンボリックリンクであろう、gnutar/usr/local/binのようにgtar

をインストールするとgnutarジョニーの答えの手順を使用して問題を再現できます

$ brew install gnu-tar
==> Downloading https://homebrew.bintray.com/bottles/gnu-tar-1.28.yosemite.bottle.2.tar.gz
######################################################################## 100.0%
==> Pouring gnu-tar-1.28.yosemite.bottle.2.tar.gz
==> Caveats
gnu-tar has been installed as "gtar".

If you really need to use it as "tar", you can add a "gnubin" directory
to your PATH from your bashrc like:

    PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
==> Summary
🍺  /usr/local/Cellar/gnu-tar/1.28: 13 files, 1.6M
$ mkdir test
$ touch test/a test/b
$ gtar -zcvf test.tar.gz test test/a # make the archive with gnutar
test/
test/a
test/b
test/a
$ gtar -ztvf test.tar.gz
drwxr-xr-x adamliter/staff   0 2015-07-28 22:41 test/
-rw-r--r-- adamliter/staff   0 2015-07-28 22:41 test/a
-rw-r--r-- adamliter/staff   0 2015-07-28 22:41 test/b
hrw-r--r-- adamliter/staff   0 2015-07-28 22:41 test/a link to test/a
$ rm -r test
$ tar -xvf test.tar.gz # try to unpack the archive with bsdtar
x test/
x test/a
x test/b
x test/a: Can't create 'test/a'
tar: Error exit delayed from previous errors.
$ echo $?
1

そのため、明らかに、重複を詰まらgnutarせるような方法で物事を異なる方法でアーカイブしbsdtarます。のgtar -ztvf test.tar.gz2番目のインスタンスがtest/aaとしてアーカイブされることを示すという事実link to test/aは関連しています。ジョニーがコメントで指摘しているようにgnutar、実際のファイルではなく、ハードリンクとして重複を保存し--hard-dereferenceます。

つまり、次のことができます。

$ mkdir test
$ touch test/a test/b
$ gtar -zcvf test.tar.gz test test/a --hard-dereference
test/
test/a
test/b
test/a
$ gtar -ztvf test.tar.gz test
drwxr-xr-x adamliter/staff   0 2015-07-28 23:49 test/
-rw-r--r-- adamliter/staff   0 2015-07-28 23:49 test/a
-rw-r--r-- adamliter/staff   0 2015-07-28 23:49 test/b
-rw-r--r-- adamliter/staff   0 2015-07-28 23:49 test/a # note that this is no longer a link
$ rm -r test
$ tar -xvf test.tar.gz # unpack with bsdtar
x test/
x test/a
x test/b
x test/a
$ echo $?
0
$ ls test/
a b

ただし、この場合、明らかにtarballの作成を制御しないため--hard-dereference、オプションはありません。幸いなことに、OPの回答に基づいて、この問題はアップストリームによって修正されたようです。

それでも、将来この問題が発生し、迅速な修正が必要な場合、またはアップストリームのメンテナーが応答しない場合は、回避策があります。

重複ファイルが何であるかを特定したら、次の--fast-readオプションを使用できますbsdtar(このオプションはの一部でありbsdtar、ではなくの 一部であることに注意してくださいgnutar)。

 -q (--fast-read)
         (x and t mode only) Extract or list only the first archive entry that matches each pattern or filename operand.  Exit as soon as each specified pat-
         tern or filename has been matched.  By default, the archive is always read to the very end, since there can be multiple entries with the same name
         and, by convention, later entries overwrite earlier entries.  This option is provided as a performance optimization.

したがって、ジョニーの答えのおもちゃの例に従って作成したおもちゃの例では、重複ファイルはtest/aです。したがって、次の操作を行うことにより、この問題を回避できます。

# this set of commands picks up from the first set of commands
# i.e., the following assumes a tarball that was *not* made with
# the --hard-dereference option, although this will work just as well
# with one that was
$ tar -xvqf test.tar.gz test/a # unarchive the first instance of test/a
x test/a
$ tar -xvf test.tar.gz --exclude test/a # unarchive everything except test/a
x test/
x test/b
$ echo $?
0
$ ls test/
a b

さらに、gnutarこの--hard-dereferenceオプションを使用しなかった場合でも、それ自体で作成された複製を含むアーカイブをアンパックして完全に満足できることに注意してください。

$ rm -r test
$ gtar -xvf test.tar.gz
test/
test/a
test/b
test/a
$ echo $?
0
$ ls test/
a b

したがって、これはMacではエラーがスローされ、Linuxではエラーがスローされない理由に関する質問に答えます。(ほとんど)Linuxディストリビューションにgnutarはが同梱されておりgnutar、tarballはおそらくパッケージ化されているので、解凍時にエラーは発生しませんが、解凍gnutar時にエラーが発生しbsdtarます。


さらに読み、参照するために、bsdtarとGNU tarの違いは何ですか?Unix.SEで。


うわー、すてきな調査、私はgnutarとbsd tarの間に大きな違いがあるとは思いもしませんでした。に基づいてgtar -tcvf、gnutarは2番目のコピーファイルをアーカイブに複製するのではなく、リンクとして最適化するのに十分な「スマート」です。
ジョニー

ドキュメントを精査した後、これはgtarのハードリンク処理の副作用であるように見えます。重複ファイルは実際にはファイルへのハードリンクであると考えられるため、実際のファイルではなくリンクとして保存します。gtarに--hard-dereferenceオプションを指定すると、この動作が無効になります。
ジョニー

@Johnnyこれを理解したのは、Homebrewのメンテナーの2人(Misty De MeoとDominyk Tiller)でした。私が使用しているいくつかのソフトウェアのメンテナーは、tarballに重複ファイルがある新しいバージョンをリリースしました。これにより、Homebrewで新しいバージョンをインストールしようとすると問題が発生しました(明らかに)。とにかく、ドキュメントをご覧いただきありがとうございます!それを答えに追加します。
アダムリットル

これは素晴らしいです。これが何が起こっているかを最も徹底的に説明しているので、これを答えにしています。ありがとう!
ジェフ

7

アーカイブ内に重複ファイルが存在しても、デフォルトではtarが重複を上書きするため、OSXでそれを無効にしたり、抽出したりすることはできません。

OSXのtarアーカイブ(としての本来の目的への先祖返りで重複したファイルを可能-だから、私はあなたの要旨での行動で混乱少しだトンのARニラ、それはファイルがの最後に追加することができますので、ユーティリティテープアーカイブ、およびアーカイブが復元されると、ファイルの最新バージョンが古いバージョンを上書きします)

tarが既存のファイルについて警告するのは、「-k」オプションが存在する場合のみです。

ここでは、重複ファイルを使用してアーカイブを作成し、問題なく抽出しました。-kオプションを追加するまで、重複ファイルについて警告されませんでした。

Macbook> tar --version
bsdtar 2.8.3 - libarchive 2.8.3
Macbook> mkdir test
Macbook> touch test/a test/b
Macbook> tar -zcvf test.tar.gz test test/a
a test
a test/a
a test/b
a test/a
Macbook> tar -ztvf test.tar.gz
drwxr-xr-x  0 user group       0 Jul 28 10:42 test/
-rw-r--r--  0 user group       0 Jul 28 10:42 test/a
-rw-r--r--  0 user group       0 Jul 28 10:42 test/b
-rw-r--r--  0 user group       0 Jul 28 10:42 test/a
Macbook> rm -r test
Macbook> tar -xvf test.tar.gz
x test/
x test/a
x test/b
x test/a
Macbook> echo $?
0
Macbook> rm -r test
Macbook> tar -k -xvf test.tar.gz
x test/
x test/a
x test/b
x test/a: Already exists
tar: Error exit delayed from previous errors.
Macbook> echo $?
1

単純なumaskの問題も原因ではないようです。umaskを0777に変更してみましたが、アーカイブを抽出できます。

Macbook> tar -xvf test.tar
x test/
x test/a
x test/b
x test/a
Macbook> ls -l test
ls: test: Permission denied
Macbook> sudo ls -l test
total 0
----------  1 someuser  wheel  0 Jul 28 13:48 a
----------  1 someuser  wheel  0 Jul 28 13:48 b

意図的にアーカイブに書き込み不可能なディレクトリを追加することで問題を再現できると思いましたが、それは機能しませんでした。tarはアーカイブを抽出したときにディレクトリのパーミッションを更新しませんでした:

Macbook> mkdir -p testdir1/test testdir2/test
Macbook> touch testdir1/test/{a,b} testdir2/test/a
Macbook> chmod -w testdir2/test
Macbook> touch testdir2/test/b
touch: testdir2/test/b: Permission denied
Macbook> find testdir* -ls  | awk '{print $3, $11}'
drwxrwx--- testdir1
drwxrwx--- testdir1/test
-rw-rw---- testdir1/test/a
-rw-rw---- testdir1/test/b
drwxrwx--- testdir2
dr-xr-x--- testdir2/test
-rw-rw---- testdir2/test/a
Macbook> cd testdir1
Macbook> tar -cvf ../test.tar test/*
a test/a
a test/b
Macbook> cd ../testdir2
Macbook> tar -rvf ../test.tar test
a test
a test/a
Macbook> cd ..
Macbook> tar -tvf ./test.tar
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/b
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
dr-xr-x---  0 username groupname       0 Jul 28 15:40 test/
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
Macbook> tar -xvf test.tar
x test/a
x test/b
x test/a
x test/
x test/a
Macbook> 

また、test / aのアクセス許可を000に変更し、アーカイブに追加してから、別のtest / aを追加しようとしましたが、それもうまくいきました。

drwxrwx---  0 username groupname       0 Jul 28 15:40 test/
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/b
dr-xr-x---  0 username groupname       0 Jul 28 15:40 test/
----------  0 username groupname       0 Jul 28 15:40 test/a
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a

だから、私は本当に問題を引き起こした元のアーカイブを見て、この問題を引き起こすためにそのアーカイブにあったかもしれないものを見たいです。

ファイル名とディレクトリが同じ名前を共有している場合、tarの抽出には問題がありますが、かなり明確なエラーメッセージが表示されます。

Macbook> tar -xvf test.tar
x test/
x test/dir1/
x test/dir1/a
x test/
x test/dir1: Can't remove already-existing dir
tar: Error exit delayed from previous errors.

(競合が逆に発生した場合、つまり、ファイルが最初に来て、その後同じ名前のディレクトリが後に来た場合、tarはそれを削除してディレクトリを作成します。

Macbook> tar -xvf test.tar
x test/
x test/dir1
x test/
x test/dir1/
x test/dir1/a

1
tarアーカイブではファイルの複製が許可されているため、彼のGist(および彼の自己回答)の動作が完全な回答ではないようであることをもう少し明確にしました。そのため、「重複ファイルでtarアーカイブを解凍できない」に対する答えは、「重複ファイルを削除する」ではないはずです。tarはそのケースを処理できるはずだからです。
ジョニー

2
これは本当にコメントです。ソリューションを提供するものではなく、既存のソリューションに関する議論にすぎません。ジョニー、これをコメントに移動してください。後で戻ってこれを削除します。最初に移動する機会を与えたいだけです。ありがとう。
イアンC.

2
@ジョニー、この情報に非常に貴重な情報がありますが、それは質問への答えではありません。別の答えに対するコメントです。このように考えてください。Geoffの回答が削除された場合、この回答は役に立ちますか?いいえ、そうではありません。本当に、この答えの内容は「Geoffによる他の答えは正しくないようだ」です。元の質問は「このエラーの原因は何ですか?」でした。「何が原因なのかはわかりませんが、重複ファイルではありません」という答えに最も近かったのですが、編集が必要であり、元の質問にはまだ答えていません。
DW

2
大きな写真は学ぶべき場所であり、この投稿の詳細はIMOのすばらしいところなので、私はむしろこれが削除されないようにします。+1で削除は不要です-OPの破損ファイルがない場合や破損の相互作用が異なる場合、同様の状況にある他の人が問題を解決するのに役立つと思いますか?
bmike

2
@bmikeその他:私が追加した答え少なくとも必ずしも必要ではないが、なぜ、ここで何が起こっているかを説明する必要があります。
アダムリットル

6

OS X tarユーティリティが正しいものであったことが判明しました!アーカイブに実際にエラーがありました。この電子メールスレッドで詳細を説明していますが、問題はアーカイブ内に重複ファイルがあることです。SCIPの連中は、これを入力するにつれてアーカイブを修正しています。

[編集]
新しく更新されたscip-3.2.0.tgzが問題なく抽出できるようになりました!新しいtgzのSHA-1ハッシュは5b4e8283f4a5bf9e50f9a62d4320d6f5f50c8476です。

[編集2]
アーカイブにエラーがあるわけではありません。それは単にことだbsdtarOS Xに付属して、ハンドルが異なっよりファイルを複製した、gnutarLinuxでどの船、。ここでの @Adam Literの答えは、何が起こっているのかを徹底的に説明しています。


1
面白い。他のユーティリティは重複ファイルのエラーを無視して、文句を言わずに先に進んでいたのでしょうか?とにかく、原因を見つけて答えてくれてうれしいです。
TryTryAgain

1
ええ、それはまさに他のユーティリティがやっていることだと思います。ここでは、OS X tarユーティリティが正しいものであると主張します。不正な形式のアーカイブは、少なくとも何か警告が発生して、何かがオフになっていることをユーザーに警告する必要があります。ご協力いただきありがとうございます!
ジェフ

tarアーカイブ内の重複ファイルは、それを不正な形式のアーカイブにすることはありません。tar形式では特に重複が許可されます。-kオプションを指定しなかったにもかかわらず、既存のファイルについて警告するMacのtarがアーカイブのアンパックを拒否した理由を知りたいです。残念なことに、彼らはすでにscip-3.2.0.tgzファイルを更新して重複を削除しているので、そのアーカイブをテストすることはできません。
ジョニー

tar抽出物は、抽出しようとしている時に異なる反応をscip-3.2.0/applications/Coloring/Makefileあなたに応じて、二回umask。最初に作成されたものが書き込みアクセスを許可しない場合、2回目の試行は失敗します。
ダン

1
@DW これが矛盾ではない理由を説明する回答を追加しまし
アダムリットル

1

Mac OSXに使用する代替の無料の軽量アーカイブソフトウェアがあります。これはKekaと呼ばれ、7zipを最も具体的に解凍するために使用します。さらに、.rar、.tar、.gzなどの他のタイプをアンパックできます。OPの特定のtarファイルでも機能しましたが、@ Geoffがファイルの修復に取り組んでいると@Geoffが述べた後で試しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.