Warum löst das Extrahieren dieses TGZ auf meinem Mac einen Fehler aus, aber nicht unter Linux?

27

Ich habe ein merkwürdiges Problem und kann nicht herausfinden, was los ist. Ich habe eine tgz-Datei, scip-3.2.0.tgz , die einen Fehler ausgibt , wenn ich versuche, sie zu entpacken. Der Fehler tritt nur unter OS X auf (ich bin auf 10.10.4). Ich kann die Datei ohne Fehler auf einer Linux-Box mit CentOS 6.6 extrahieren. Der Fehler tritt sowohl bei Verwendung des Befehlszeilenbefehls tarals auch bei Verwendung des Archivierungsdienstprogramms auf. Ich habe die SCIP-Mailingliste per E-Mail gesendet und habe denselben SHA-1-Hash wie ein anderer Benutzer ( e085a4a3591eddf945dcb365d97d2512c267e374), sodass kein Download-Fehler aufgetreten ist. Sie sind sich nicht sicher, was los ist.

Die folgende Fehlermeldung wird angezeigt, wenn ich versuche, mit dem Archivierungsdienstprogramm zu entpacken:

Fehler beim Archivierungsdienstprogramm

Für den Fall, dass das Bild jemals kaputt geht, lautet der Text im Bild wie folgt:

"Scip-3.2.0.tgz" kann nicht in "Desktop" erweitert werden.
(Fehler 1 - Vorgang nicht zulässig.)

Und wenn ich versuche, über die Befehlszeile zu entpacken, erhalte ich diese Ausgabe . Es ist die letzte Zeile ( tar: Error exit delayed from previous errors.), die mich betrifft. Ich sehe nicht, was es verursacht. Das Archiv scheint ohne Probleme zu extrahieren, aber ich vertraue nicht darauf, dass dieser Fehler ausgelöst wird.

Weiß jemand, was das verursacht?

[edit] Bei
genauerer Betrachtung der Ausgabe enthält Zeile 1108 den Fehler:

x scip-3.2.0/applications/Coloring/Makefile: Can't create 'scip-3.2.0/applications/Coloring/Makefile'
Geoff
quelle
2
Funktioniert es mit einer anderen App wie dem Unarchiver? wakaba.c3.cx/s/apps/unarchiver.html
TryTryAgain
Ja tut es! Ich frage mich, was sie anders machen. Ein Teil des Problems ist, dass ich ein Bash-Skript habe, das eine Reihe von Dingen automatisiert, und eines der Dinge, die es tun muss, ist, diese tgz zu extrahieren, damit es das aufbauen kann, was darin enthalten ist. Ich frage mich, ob der tarBefehl, der mit OS X
geliefert wird
1
Möglicherweise gibt es einen Fehler. Ich fand das eingebaute OS X-Archivierungsprogramm ziemlich beschissen. Gibt es keine Möglichkeit, die benötigten Dateien in einer Zip-Datei oder etwas anderem zu archivieren? Tritt der Fehler auch dann auf, wenn Sie ein gunzip -c scip-3.2.0.tgz | tar xopf -Skript ausführen, wie Sie es für Ihr Skript verwenden würden?
TryTryAgain
Ja, dieser Befehl löst den gleichen Fehler aus. gunzipfunktioniert einwandfrei, aber wenn ich versuche, das unkomprimierte Tarball zu extrahieren, wird der Fehler ausgelöst.
Geoff
Ah, es stellte sich heraus, dass tatsächlich ein Fehler im Tarball aufgetreten ist! Ich bin nicht verrückt. Ich werde eine ausführlichere Antwort schreiben. Anscheinend war das tar-Dienstprogramm in OS X das richtige hier!
Geoff

Antworten:

32

Dies sollte helfen, herauszufinden, was in Johnnys Antwort vor sich geht , und die Frage zu beantworten , warum dies unter Linux, aber nicht auf Mac funktioniert.

Das Problem liegt in der Tatsache, dass Mac OS X verwendet bsdtar, während die meisten Linux-Systeme verwenden gnutar.

Sie können installieren gnutarauf einem Mac mit Homebrew verwenden brew install gnu-tar, die Symlink wird gnutarin /usr/local/binso gtar.

Wenn Sie installieren gnutar, können Sie das Problem anhand der Schritte in Johnnys Antwort reproduzieren .

$ 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

Offensichtlich werden die gnutarDinge also anders archiviert, sodass bsdtarDuplikate erstickt werden. Die Tatsache, gtar -ztvf test.tar.gzdass die zweite Instanz von test/aals a archiviert wird, link to test/aist relevant. Wie Johnny in den Kommentaren hervorhebt, gnutarwerden Duplikate als feste Links und nicht als tatsächliche Dateien gespeichert, mit denen deaktiviert werden kann --hard-dereference.

Das heißt, Sie könnten Folgendes tun:

$ 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

In diesem Fall haben Sie jedoch offensichtlich keinen Einfluss auf die Erstellung des Tarballs. Daher ist dies --hard-dereferencekeine Option. Zum Glück scheint es , basierend auf der Antwort des OP , dass dieses Problem durch den Upstream behoben wurde.

Wenn jedoch in Zukunft jemand anderes auf dieses Problem stößt und eine schnelle Lösung benötigt oder einen nicht reagierenden Upstream-Betreuer hat, gibt es eine Problemumgehung.

Sobald Sie die doppelte Datei identifiziert haben, können Sie die --fast-readOption von verwenden bsdtar(beachten Sie, dass diese Option nur ein Teil von ist bsdtar, nicht 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.

In dem Spielzeugbeispiel, das ich in Anlehnung an das Spielzeugbeispiel in Johnnys Antwort erstellt habe , lautet die doppelte Datei test/a. So können Sie dieses Problem vermeiden, indem Sie folgendermaßen vorgehen:

# 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

Beachten Sie außerdem, dass Sie gnutargerne ein Archiv mit Duplikaten entpacken, die selbst erstellt wurden, auch wenn die --hard-dereferenceOption nicht verwendet wurde:

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

Dies beantwortet also Ihre Frage, warum ein Fehler auf Mac, aber nicht auf Linux ausgegeben wird. (Die meisten) Linux-Distributionen werden mit ausgeliefert gnutar, und da der Tarball vermutlich mit gepackt wurde , tritt gnutarbeim Entpacken kein Fehler auf gnutar, aber beim Entpacken mit bsdtar.


Zur weiteren Lektüre und zum Nachschlagen möchte man vielleicht einen Blick auf Was sind die Unterschiede zwischen bsdtar und GNU tar? auf Unix.SE.

Adam Liter
quelle
Wow, nettes Sleuthing, ich hatte keine Ahnung, dass es einen signifikanten Unterschied zwischen Gnutar und BSD-Teer gab. Basierend auf Ihrer gtar -tcvfist gnutar "intelligent" genug, um die zweite Kopie als Link zu optimieren, anstatt sie im Archiv zu duplizieren.
Johnny
Nach dem Durchsuchen der Dokumente sieht es so aus, als ob dies ein Nebeneffekt des Hardlink-Handlings von gtar ist. Anscheinend handelt es sich bei der duplizierten Datei um eine feste Verknüpfung mit der Datei, sodass sie als Verknüpfung anstelle der eigentlichen Datei gespeichert wird. Wenn Sie gtar die --hard-dereferenceOption geben, wird dieses Verhalten deaktiviert.
Johnny
@ Johnny Es waren wirklich zwei der Homebrew-Betreuer, die das herausgefunden haben (Misty De Meo und Dominyk Tiller). Ein Betreuer einer von mir verwendeten Software hat eine neue Version mit einer doppelten Datei im Tarball veröffentlicht, die (offensichtlich) Probleme bei der Installation der neuen Version mit Homebrew verursachte. Wie auch immer, danke, dass du dir die Dokumente angesehen hast! Ich werde das zur Antwort hinzufügen.
Adam Liter
Das ist ausgezeichnet. Ich bezeichne dies als die Antwort, da es die gründlichste Erklärung dafür ist, was los ist. Vielen Dank!
Geoff
7

Das Vorhandensein einer doppelten Datei im Archiv sollte diese nicht ungültig machen oder unter OSX nicht extrahiert werden können, da tar standardmäßig doppelte Dateien überschreibt.

Also, ich bin ein wenig durch das Verhalten in Ihrem Gist verwirrt - OSX tar für doppelte Dateien in einem Archiv ermöglicht (eine Reminiszenz an seinen ursprünglichen Zweck als t Affe ar schnittlauch Dienstprogramm, so dass es Dateien können an das Ende angehängt werden Das Bandarchiv. Wenn das Archiv wiederhergestellt wird, überschreibt die neueste Version der Datei die ältere (n) Version (en).

Nur wenn die Option "-k" vorhanden ist, sollte tar vor bereits vorhandenen Dateien warnen.

Hier habe ich ein Archiv mit einer doppelten Datei erstellt und es dann ohne Probleme extrahiert. Erst als ich die Option -k hinzugefügt habe, wurde ich vor der doppelten Datei gewarnt:

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

Ein einfaches Umask-Problem scheint auch nicht der Schuldige zu sein. Ich habe versucht, meine Umask auf 0777 zu ändern und kann das Archiv trotzdem extrahieren:

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

Ich dachte, ich könnte das Problem duplizieren, indem ich absichtlich ein nicht beschreibbares Verzeichnis an das Archiv anhänge, aber das funktionierte nicht, tar aktualisierte die Berechtigungen für das Verzeichnis nicht, als es das Archiv extrahierte:

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> 

Ich habe auch versucht, die Berechtigungen für test / a in 000 zu ändern, sie an das Archiv anzuhängen und dann einen weiteren Test / a anzuhängen, aber dieser hat auch funktioniert:

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

Daher würde ich gerne das Originalarchiv sehen, das das Problem verursacht hat, und sehen, was in diesem Archiv enthalten sein könnte, um dieses Problem zu verursachen.

Wenn ein Dateiname und ein Verzeichnis denselben Namen haben, hat tar zwar ein Problem beim Extrahieren, aber eine ziemlich klare Fehlermeldung:

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.

(Wenn der Konflikt umgekehrt aufgetreten ist, dh eine Datei zuerst kam, dann kam ein Verzeichnis mit dem gleichen Namen später, tar entfernt es einfach und erstellt das Verzeichnis:

Macbook> tar -xvf test.tar
x test/
x test/dir1
x test/
x test/dir1/
x test/dir1/a
Johnny
quelle
1
Ich habe etwas klarer formuliert, dass das Verhalten in seinem Gist (und seiner Selbstantwort) nicht die vollständige Antwort zu sein scheint, da Dateiduplikate in einem Tar-Archiv zulässig sind. Die Antwort auf "Ich kann ein tar-Archiv mit einer duplizierten Datei nicht entpacken" sollte also nicht "Die duplizierte Datei entfernen" lauten, da tar diesen Fall behandeln soll.
Johnny
2
Dies ist wirklich ein Kommentar - es bietet keine Lösung, sondern nur eine Diskussion über eine vorhandene Lösung. Johnny, kannst du das bitte in einen Kommentar verschieben? Ich komme zurück und lösche dies später. Ich wollte dir nur die Chance geben, es zuerst zu verschieben. Vielen Dank.
Ian C.
2
@Johnny, diese Information nicht haben super-wertvolle Informationen, aber es ist keine Antwort auf die Frage. Es ist ein Kommentar zu einer anderen Antwort. Stellen Sie sich das so vor: Wenn Geoffs Antwort gelöscht wurde, wäre diese Antwort nützlich? Nein, würde es nicht. Wirklich, der Inhalt dieser Antwort ist "diese andere Antwort von Geoff scheint nicht korrekt zu sein". Die ursprüngliche Frage lautete: "Was verursacht diesen Fehler?" Das, was Sie am ehesten beantworten könnten, war "Ich weiß nicht, was es verursacht, aber es ist keine doppelte Datei" - aber das würde eine Bearbeitung erfordern und die ursprüngliche Frage immer noch nicht wirklich beantworten.
DW
2
Ich würde es vorziehen, dass dies nicht gelöscht wird, da dies ein Ort zum Lernen ist und die Details in diesem Beitrag meiner Meinung nach hervorragend sind. +1 und kein Löschen erforderlich - Ich denke, es wird anderen in einer ähnlichen Situation helfen, Dinge herauszufinden, wenn sie nicht die beschädigte Datei des OP haben oder die Interaktion mit der Beschädigung anders ist, nicht wahr?
bmike
2
@bmike und andere: Ich habe eine Antwort hinzugefügt , die zumindest erklären soll, was hier vor sich geht, aber nicht unbedingt warum.
Adam Liter
6

Es stellte sich heraus, dass das OS X-Dienstprogramm tar das richtige war! Es ist tatsächlich ein Fehler im Archiv aufgetreten. In diesem E-Mail-Thread wird dies ausführlicher beschrieben. Das Problem besteht jedoch darin, dass das Archiv eine doppelte Datei enthält . Die SCIP-Leute reparieren das Archiv, während ich das schreibe.

[edit]
Die neu aktualisierte scip-3.2.0.tgz wird jetzt ganz gut extrahiert! Der SHA-1 Hash des neuen TGZ ist 5b4e8283f4a5bf9e50f9a62d4320d6f5f50c8476.

[edit 2]
Es ist nicht so, dass es einen Fehler im Archiv gibt. Es ist einfach so, dass das bsdtar, was mit OS X geliefert wird, doppelte Dateien anders behandelt als das gnutar, was mit Linux geliefert wird. @ Adam Liter Antwort hier bietet eine gründliche Erklärung dessen , was geschieht.

Geoff
quelle
1
Interessant. Vielleicht haben die anderen Dienstprogramme den doppelten Dateifehler ignoriert und sind weitergegangen, ohne sich zu beschweren? Wie auch immer, ich bin froh, dass du die Ursache und Antwort gefunden hast.
TryTryAgain
1
Ja, ich denke, genau das machen die anderen Dienstprogramme. Ich würde argumentieren, dass das OS X-Dienstprogramm tar hier das richtige ist. Ein fehlerhaftes Archiv sollte immer mindestens eine Warnung auslösen, um den Benutzer darauf aufmerksam zu machen, dass etwas nicht funktioniert. Danke für Ihre Hilfe!
Geoff
Eine doppelte Datei in einem Tar-Archiv macht es nicht zu einem fehlerhaften Archiv. Das Tar-Format erlaubt speziell Dupes. Ich bin neugierig, warum Ihr Mac-Teer sich geweigert hat, das Archiv zu entpacken, obwohl Sie die -kOption nicht angegeben haben, wodurch vor bereits vorhandenen Dateien gewarnt würde. Leider haben sie die scip-3.2.0.tgzDatei bereits aktualisiert , um die Dupe zu entfernen, sodass ich dieses Archiv nicht testen kann.
Johnny
Der tarExtrakt reagiert unterschiedlich, scip-3.2.0/applications/Coloring/Makefileje nachdem, ob Sie versuchen, ihn zweimal zu extrahieren umask. Wenn der erste erstellte keinen Schreibzugriff hinterlässt, schlägt der zweite Versuch fehl.
Dan
1
@ DW Ich habe eine Antwort hinzugefügt , die erklärt, warum dies kein Widerspruch ist.
Adam Liter
1

Es gibt eine alternative, kostenlose und leichte Archivierungssoftware, die ich für Mac OS X verwende. Es heißt Keka und ich benutze es, um 7zip speziell zu entpacken. Außerdem kann es andere Typen wie .rar, .tar, .gz usw. entpacken. Es funktionierte auch für die spezifische TAR-Datei des OP, aber ich habe es versucht, nachdem @Geoff erwähnt hatte, dass das Team daran arbeitete, die Datei zu reparieren.

ThisClark
quelle