Question Incompatibilité tar Linux / OS X - les archives créées sur OS X génèrent des erreurs lorsqu'elles sont supprimées sous Linux


Lorsque je charge des fichiers sur mon Macbook et que je les décompresse sous Linux, je reçois à plusieurs reprises les avertissements / erreurs suivants:


 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

Heureusement, cela n'affecte pas les fichiers stockés dans l'archive, qui sont parfaitement restaurés. Cependant, cela pose des problèmes dans un certain nombre de scénarios, en particulier lorsqu’il s’agit de processus de génération où le code d’échec non nul renvoyé par «tar» entraîne des mises à jour et s’installe inutilement.

Comment puis-je obtenir OS X pour construire des fichiers tar qui jouent bien avec le reste du monde Linux?

En outre, pour les points bonus, il existe un fichier tar distribué publiquement avec ces problèmes. Y at-il un moyen pour que Linux gère le fichier tar gracieusement sans pour autant changer la façon dont il a été compressé à l'origine?


93
2017-08-03 21:47


origine




Réponses:


J'ai cherché sur Google pour le message d'erreur et cela ressemble à un goudron BSD vs GNU tar problème.

Installer GNU tar si vous pouvez sur Mac OS et l'utiliser pour créer le tar.


65
2017-08-03 22:00



Mac OS X 10.6 utilise un tar BSD par défaut mais est également livré avec un gnutar à /usr/bin/gnutar.
@Ned. THX. c'est une bonne info. - Dave Dopson
FYI: / usr / bin / gnutar n'est plus livré avec Mac OS X (au moins comme Mavericks) - foobar
port sudo installe gnutar cd / usr / bin sudo rm tar sudo ln -s / opt / local / bin / gnutar tar - chaosless
Si vous utilisez MacPorts, vous pouvez aussi placer / opt / local / libexec / gnubin / en haut de votre PATH plutôt que de supprimer quoi que ce soit de / usr / bin ou de créer manuellement des liens symboliques. - Lorrin


Si vous utilisez Mavericks ou plus récent, alors gnutar n'est plus inclus par défaut.

Le travail autour de vous, si vous utilisez l'homebrew, est d'exécuter ce qui suit:

brew install gnu-tar

Vous pouvez ensuite utiliser la commande gtar pour la compatibilité Linux.


Si vous voulez remplacer tar avec gtar, remplacez simplement le lien symbolique

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

Pour restaurer le tar d'origine fourni avec Mac Os X, exécutez les commandes ci-dessus mais remplacez which gtar avec which bsdtar

La source:
https://github.com/jordansissel/fpm/issues/576


54
2017-12-14 02:31



Plus besoin de dissocier, comme l’indique le brew, vous pouvez simplement ajouter ceci à votre PATH dans .bashrc (ou votre équivalent): PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH" - Bryan Petty
Ou créez simplement un tar lien dans /usr/local/bin par cd /usr/local/bin ; ln -s gtar tar - éventuellement l'option la plus simple - Karthik T


GNU tar n'aime pas certaines des informations facultatives incluses dans le tar OSD BSD par défaut.

GNU tar vous permettra de supprimer ces avertissements avec l'option:

--warning=no-unknown-keyword

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

Notez que BSD tar ne supporte pas cet indicateur, donc si vous devez exécuter le même code de décompression sur toutes les plateformes, vous pouvez utiliser quelque chose comme:

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

21
2018-06-03 14:30



Cela devrait être la bonne solution, car cela n’implique pas l’installation d’un nouvel outil pour supprimer un seul avertissement. - c z


Pour extraire correctement le fichier tar sans erreur sur un système Linux, vous pouvez utiliser bsdtar.

sudo apt-get install bsdtar

Ensuite, utilisez comme d'habitude.

bsdtar -xvf file.tar où file.tar est le fichier tar que vous souhaitez extraire.

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

Vous pouvez également utiliser le rouleau de fichiers GNOME.


9
2018-05-06 17:36





COPYFILE_DISABLE=1 tar cf filename.tar

ou

tar --disable-copyfile cf filename.tar

C'est la fonctionnalité la moins détectable de tar sur OS X dont je suis personnellement conscient.

Voir également Pourquoi est-ce que je reçois des fichiers comme ._foo dans mon archive sur OS X?


Edit: on dirait que cela ne peut que stopper la création des indésirables ._foo-types de fichiers, il n'arrête pas la création d'en-tête (au moins sur Yosemite / 10.10); Merci aux commentateurs de l'avoir signalé. Cependant, (pour les points bonus :), vous pouvez gérer ces archives en les extrayant comme ceci:

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

Cela a fonctionné en utilisant gnu tar 1.15.1, qui est assez vieux! Alternativement, vous pouvez utiliser pax à la place, ce qui (pour moi) lance les informations supplémentaires dans un PaxHeader répertoire, mais au moins quitte sans erreur:

pax -rf filename.tar

5
2018-03-04 20:30



Malheureusement, cela ne semble pas arrêter les avertissements de mots-clés d'en-tête étendus lors de la décomposition avec gnutar. - JJC
Ni l'un ni l'autre ne semble fonctionner sur Yosemite (tar --version indique bsdtar 2.8.3 - libarchive 2.8.3). Aussi j'ai besoin d'un tiret avant cf Dans le dernier cas. - tripleee


MacOSX est déjà livré avec gnutar. Si vous voulez une solution rapide et sale, ajoutez ceci à ~/.bash_profile

alias tar='gnutar'

et courir source ~/.bash_profile mettre à jour

De plus, OSX est fourni avec GNU et BSD tar. Donc, vous pouvez également dissocier la ref de tar de bsd à gnu:

sudo unlink /usr/bin/tar;
sudo ln -s /usr/bin/gnutar /usr/bin/tar

3
2018-02-21 16:25



Pourquoi en /etc/hosts? /etc/hosts est pour la cartographie hôte / IP, non? - BenjiWiebe
ce que @BenjiWiebe a dit. Le bit le plus étrange est l'édition de / etc / hosts. Je pense que vous vouliez dire ~ / .bashrc - Dave Dopson
Sur OS X, .bashrc n'est pas chargé pour les sessions Terminal Server. Vous avez besoin .bash_profile, car un shell de connexion est démarré avec une nouvelle fenêtre Terminal. / cc @BenjiWiebe - slhck
Correct :-) Je travaillais également dans / etc / hosts à ce moment-là. Bonne prise - Du3


Je vous remercie. Ce fil était très utile. Si vous utilisez MacPorts, voici un guide pratique:

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

Ajoutez la ligne suivante à /Users/[yourname]/.profile

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

Quittez und et redémarrez votre fenêtre Terminal.


2
2018-01-04 15:08





Oui, le binaire tar de Mac ajoute un tas de choses supplémentaires que CentOS n'aime pas. Pour résoudre ce problème, procédez comme suit:

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

J'espère que cela pourra aider!


1
2018-02-07 18:28



C'est un sens. J'ai résolu le problème de GNU / BSD de manière plus complète dans github.com/ddopson/dotfiles. J'ai ~ / bin / coreutils tôt dans le chemin et il y a des petites cales comme github.com/ddopson/dotfiles/blob/master/bin/coreutils/tar qui choisit le bon exécutable basé sur Linux vs Mac et si la variable d'environnement COREUTILS est définie - Dave Dopson
Vous voudrez peut-être modifier vos instructions pour demander aux utilisateurs de vérifier l'existence de / usr / bin / gnutar avant de déplacer leur tar actif. Les débutants peuvent trouver cela en utilisant google et ne pas savoir comment casser leur système. - msouth
Ce n'est probablement pas une bonne idée, pour plusieurs raisons. 1) Maintenant, les paquets Apple ne savent pas où trouver le tar natif, le tar qui sait gérer les attributs de fichiers Apple. 2) Si vous devez utiliser GNU tar, le bon endroit pour le mettre en avant dans votre chemin de recherche, comme / usr / local / bin, ou quelque chose, et 3) tar programme gnutar pour éviter les logiciels déroutants qui attendent un Mac pour agir comme un Mac. 0,02 $ -Erik - Erik Bennett


OK, j'ai utilisé la recherche Google, mais les trois premiers liens ont confirmé ce que je soupçonnais

  1. Bug dans votre goudron ET / OU
  2. Incompatibilité entre les deux utilitaires tar
    Voir ce lien. Quelqu'un rapporte que "Utiliser" bsdtar -xvf "a fonctionné." 

Modifier: Vous êtes sur Mac, je pensais à autre chose. Vous devrez utiliser gnutar, il devrait déjà être installé, sinon installez-le. Bien sûr, vous pouvez regarder d’autres liens en vous cherchant vous-même.


0
2017-08-03 22:04





Sur MAC OSX, installez gnu-tar

brew install gnu-tar

puis créez votre tar compatible Linux avec:

gtar -c -f your_tar_file files

Ou vous pouvez créer votre archive au format pax

tar -c --format pax -f your_tar_file files

0
2017-08-06 06:50