Linux / OS X-Tar-Inkompatibilität - Unter OS X erstellte Tarballs führen zu Fehlern, wenn sie unter Linux nicht geteert sind

106

Wenn ich Dateien auf meinem Macbook tariere und unter Linux entpacke, erhalte ich wiederholt die folgenden Warnungen / Fehler:


 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

Glücklicherweise wirkt sich dies NICHT auf die im Archiv gespeicherten Dateien aus, die perfekt wiederhergestellt werden. In einigen Szenarien treten jedoch Probleme auf, insbesondere bei Build-Prozessen, bei denen der von 'tar' zurückgegebene Fehlercode ungleich Null dazu führt, dass Builds und Installationen unnötig angehalten werden.

Wie kann ich OS X dazu bringen, TAR-Dateien zu erstellen, die gut mit dem Rest der Linux-Welt zusammenspielen?

Außerdem gibt es für Bonuspunkte eine öffentlich verteilte TAR-Datei mit diesen Problemen. Gibt es eine Möglichkeit, Linux dazu zu bringen, die tar-Datei ordnungsgemäß zu verarbeiten, ohne die Art und Weise zu ändern, in der sie ursprünglich komprimiert wurde?

Dave Dopson
quelle

Antworten:

71

Ich habe nach der Fehlermeldung gegoogelt und es scheint ein BSD-Teer-gegen-GNU- tarProblem zu sein.

Installieren Sie GNU, tarwenn Sie es unter Mac OS können, und verwenden Sie es, um das zu erstellen tar.

Holygeek
quelle
17
Mac OS X 10.6 verwendet standardmäßig einen BSD-Teer, wird jedoch auch mit einem gnutar unter ausgeliefert /usr/bin/gnutar.
@Ned. Vielen Dank. Das ist eine gute Info.
Dave Dopson
15
Zu Ihrer Information: / usr / bin / gnutar wird nicht mehr mit Mac OS X (zumindest ab Mavericks) ausgeliefert
foobar
sudo port installiere gnutar cd / usr / bin sudo rm tar sudo ln -s / opt / local / bin / gnutar tar
chaoslos
Wenn Sie MacPorts verwenden, können Sie / opt / local / libexec / gnubin / auch ganz oben auf Ihren PATH setzen, anstatt etwas aus / usr / bin zu entfernen oder Symlinks manuell zu erstellen.
Lorrin
62

Wenn Sie Mavericks oder neuer verwenden, ist Gnutar standardmäßig nicht mehr enthalten.

Wenn Sie Homebrew verwenden, müssen Sie die folgenden Schritte ausführen:

brew install gnu-tar

Sie können dann den Befehl gtarfür Linux-Kompatibilität verwenden.


Wenn Sie ersetzen möchten tarmit gtar, ersetzen Sie einfach den Symlink

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

Zur Wiederherstellung des ursprünglichen Teer , die mit Mac OS X, führen Sie die oben genannten Befehle aber ersetzen which gtarmitwhich bsdtar

Quelle:
https://github.com/jordansissel/fpm/issues/576

Spuder
quelle
4
Es ist nicht mehr nötig, die Verknüpfung zu trennen. Sie können dies einfach zu Ihrem PATH in .bashrc(oder Ihrem Äquivalent) hinzufügen :PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
Bryan Petty,
1
Oder erstellen Sie einfach einen tarLink in /usr/local/binvon cd /usr/local/bin ; ln -s gtar tar- möglicherweise die einfachste Option
Karthik T
27

GNU tar mag einige der optionalen Informationen, die der Standard OSX BSD tar enthält, nicht.

Mit GNU tar können Sie diese Warnungen mit der Option unterdrücken:

--warning=no-unknown-keyword

Siehe: https://www.gnu.org/software/tar/manual/html_section/tar_27.html

Beachten Sie, dass BSD tar dieses Flag nicht unterstützt. Wenn Sie also auf allen Plattformen denselben Entpackungscode ausführen müssen, können Sie Folgendes verwenden:

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
Chris
quelle
5
Dies sollte die richtige Antwort sein, da es nicht erforderlich ist, ein völlig neues Tool zu installieren, um eine einzelne Warnung zu unterdrücken.
cz
10

Um die tar-Datei auf einem Linux-System fehlerfrei zu extrahieren, können Sie bsdtar verwenden.

sudo apt-get install bsdtar

Dann wie gewohnt anwenden.

bsdtar -xvf file.tarWo file.tarist die TAR-Datei, die Sie extrahieren möchten?

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

Alternativ können Sie auch GNOME File Roller verwenden.

daka
quelle
6
COPYFILE_DISABLE=1 tar cf filename.tar

oder

tar --disable-copyfile cf filename.tar

Dies ist die am wenigsten erkennbare Funktion von tar unter OS X, die mir persönlich bekannt ist.

Siehe auch Warum bekomme ich in meinem Tarball unter OS X Dateien wie ._foo?


Bearbeiten: Es sieht so aus, als würde die Erstellung von ._fooDateien mit unerwünschtem Typ nur gestoppt. Die Header-Erstellung wird nicht gestoppt (zumindest unter Yosemite / 10.10). Vielen Dank Kommentatoren für den Hinweis. Allerdings (für die Bonuspunkte :) können Sie solche Tarballs elegant handhaben, indem Sie sie wie folgt extrahieren:

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

Dies funktionierte mit Gnu Teer 1.15.1, der ziemlich alt ist! Alternativ können Sie stattdessen pax verwenden, das (für mich) die zusätzlichen Informationen in ein PaxHeaderVerzeichnis wirft , aber zumindest fehlerfrei beendet:

pax -rf filename.tar
Zac Thompson
quelle
Leider scheint dies die Warnungen vor erweiterten Header-Schlüsselwörtern nicht zu stoppen, wenn der Teer mit gnutar entfernt wird.
JJC
Beides scheint bei Yosemite nicht zu funktionieren ( tar --versiongibt an bsdtar 2.8.3 - libarchive 2.8.3). Auch cfim letzteren Fall brauche ich vorher einen Gedankenstrich .
Tripleee
4

MacOSX wird bereits mit Gnutar ausgeliefert. Wenn Sie eine schnelle und schmutzige Lösung wünschen, fügen Sie diese hinzu~/.bash_profile

alias tar='gnutar'

und source ~/.bash_profilezum Aktualisieren ausführen

Zusätzlich wird OSX mit GNU und BSD Tar ausgeliefert. Sie können also auch die Verknüpfung von tar von bsd zu gnu aufheben:

sudo unlink /usr/bin/tar;
sudo ln -s /usr/bin/gnutar /usr/bin/tar
Du3
quelle
1
Warum in /etc/hosts? /etc/hostsist für Host / IP-Mapping, oder?
BenjiWiebe
1
was @BenjiWiebe gesagt hat. Das noch seltsamere Bit ist das Bearbeiten von / etc / hosts. Ich denke du meintest ~ / .bashrc
Dave Dopson
2
Wird unter OS X .bashrcnicht für Terminal-Sitzungen geladen. Sie benötigen .bash_profile, da eine Login-Shell mit einem neuen Terminal-Fenster gestartet wird. / cc @BenjiWiebe
slhck
Richtig :-) Ich habe zu dieser Zeit auch in / etc / hosts gearbeitet und es hat sich auf die Tastatur ausgewirkt. Guter Fang
Du3
2

Danke. Dieser Thread war sehr nützlich. Wenn Sie MacPorts verwenden, finden Sie hier eine kurze Anleitung:

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

Fügen Sie die folgende Zeile zu /Users/[Ihr Name)/.profile hinzu

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

Beenden und starten Sie Ihr Terminalfenster neu.

Howdytom
quelle
1

Ja, Macs eingebaute tar-Binärdatei fügt eine Reihe zusätzlicher Dinge hinzu, die CentOS nicht mag. Um dies zu beheben, gehen Sie wie folgt vor:

sudo mv /usr/bin/tar /usr/bin/darwintar
sudo ln -s /usr/bin/gnutar /usr/bin/tar
ls -l /usr/bin/tar

Ich hoffe, das hilft!

Shaheen Ghiassy
quelle
Das ist ein Weg. Ich habe das GNU / BSD-Problem unter github.com/ddopson/dotfiles umfassender gelöst . Ich habe ~ / bin / coreutils am Anfang des Pfades und es gibt kleine Shims wie github.com/ddopson/dotfiles/blob/master/bin/coreutils/tar , die die richtige ausführbare Datei basierend auf Linux vs. Mac und der COREUTILS-Umgebung auswählen Variable ist gesetzt
Dave Dopson
Möglicherweise möchten Sie Ihre Anweisungen ändern, um die Benutzer auf das Vorhandensein von / usr / bin / gnutar zu prüfen, bevor sie ihren Arbeits-Tar verschieben. Neulinge können dies mit Google finden und wissen nicht, wie sie ihr System auflösen sollen.
Msouth
Das ist wahrscheinlich aus mehreren Gründen keine gute Idee. 1) Jetzt wissen Apple-Pakete nicht, wo sie den nativen Teer finden, der weiß, wie man mit Apple-Dateiattributen umgeht. 2) Wenn Sie GNU tar verwenden müssen, befindet sich der richtige Platz in Ihrem Suchpfad, z. B. / usr / local / bin, und 3) es ist wahrscheinlich sicherer, das fremde tarProgramm gnutar aufzurufen, um verwirrende Software zu vermeiden Erwarten, dass sich ein Mac wie ein Mac verhält. 0,02 US-Dollar. -Erik
Erik Bennett
0

Okay, ich habe die Google-Suche verwendet, aber die obersten drei Links haben bestätigt, was ich vermutet habe

  1. Fehler in Ihrem Teer UND / ODER
  2. Inkompatibilität zwischen den beiden Dienstprogrammen tar
    Siehe diesen Link . Dort meldet jemand, dass "Using" bsdtar -xvf "funktioniert hat."

Bearbeiten: Sie sind auf Mac-System, dachte ich anders herum. Sie müssen gnutar verwenden, es sollte bereits installiert sein, wenn es nicht installiert wird. Natürlich können Sie sich auch andere Links ansehen, indem Sie selbst suchen.

Sudhi
quelle
0

Installieren Sie unter MAC OSX gnu-tar

brew install gnu-tar

Dann erstelle deinen Linux-kompatiblen Teer mit:

gtar -c -f your_tar_file files

Oder Sie können Ihr Archiv im Pax-Format erstellen

tar -c --format pax -f your_tar_file files
msadek
quelle