Incompatibilité des fichiers sous Linux / OS X: les fichiers compressés créés sous OS X génèrent des erreurs lorsqu'ils ne sont pas sous Linux

106

Lorsque je cible des fichiers sur mon Macbook et 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 pour lesquels le code d'échec non nul renvoyé par 'tar' provoque l'arrêt inutilement des générations et des installations.

Comment puis-je obliger OS X à créer des fichiers tar qui fonctionnent bien avec le reste du monde Linux?

De plus, pour les points bonus, il existe un fichier tar distribué publiquement avec ces problèmes. Existe-t-il un moyen de faire en sorte que Linux gère correctement le fichier tar sans modifier la façon dont il a été compressé à l'origine?

Dave Dopson
la source

Réponses:

70

J'ai cherché sur Google pour le message d'erreur et cela ressemble à un tarproblème entre BSD et GNU .

Installez GNU tarsi vous le pouvez sur Mac OS et utilisez-le pour créer le fichier tar.

Holygeek
la source
17
Mac OS X 10.6 utilise un tar BSD par défaut, mais est également livré avec un gnutar at /usr/bin/gnutar.
@Ned. Merci. c'est une bonne information.
Dave Dopson
15
Pour votre information: / usr / bin / gnutar n'est plus livré avec Mac OS X (du moins à partir de Mavericks)
mercredi
sudo port installation gnutar cd / usr / bin sudo rm tar ln -s sudo / opt / tar local / bin / gnutar
chaosless
Si vous utilisez MacPorts, vous pouvez également simplement mettre / 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
60

Si vous utilisez Mavericks ou une version plus récente, gnutar n'est plus inclus par défaut.

Si vous utilisez homebrew, vous devez exécuter les tâches suivantes:

brew install gnu-tar

Vous pouvez ensuite utiliser la commande gtarpour la compatibilité linux.


Si vous voulez remplacer tarpar 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 fichier tar d'origine fourni avec Mac Os X, exécutez les commandes ci-dessus mais remplacez-le which gtarparwhich bsdtar

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

spuder
la source
4
Plus besoin de dissocier plus, comme le dit la brasserie, vous pouvez simplement ajouter ceci à votre PATH dans .bashrc(ou votre équivalent):PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
Bryan Petty
1
Ou tout simplement créer un tarlien /usr/local/binpar cd /usr/local/bin ; ln -s gtar tar- peut - être l'option la plus simple
Karthik T
27

Les fichiers GNU tar n’aiment pas certaines des informations facultatives incluses dans les fichiers OSX 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 prend pas en charge cet indicateur. Par conséquent, 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
Chris
la source
5
cela devrait être la bonne réponse car il ne s'agit pas d'installer un outil entièrement nouveau dans le but de supprimer un seul avertissement.
cz
10

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

sudo apt-get install bsdtar

Ensuite, utilisez comme d'habitude.

bsdtar -xvf file.tarfile.tarest le fichier tar que vous voulez extraire.

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

Sinon, vous pouvez également utiliser le rouleau de fichiers GNOME.

Daka
la source
6
COPYFILE_DISABLE=1 tar cf filename.tar

ou

tar --disable-copyfile cf filename.tar

C’est la fonctionnalité de tar la moins découverte sur OS X à ma connaissance.

Voir aussi Pourquoi ai-je des fichiers comme ._foo dans mon archive tarball sur OS X?


Edit: il semble que cela pourrait uniquement arrêter la création des ._foofichiers de type indésirable , mais pas la création de l'en-tête (du moins sur Yosemite / 10.10); merci aux commentateurs de l'avoir signalé. Cependant, (pour les points bonus :), vous pouvez gérer avec élégance de telles archives en les extrayant comme ceci:

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

Cela a fonctionné avec gnu tar 1.15.1, qui est assez vieux! Alternativement, vous pouvez utiliser pax à la place, ce qui (pour moi) jette les informations supplémentaires dans un PaxHeaderrépertoire, mais au moins se ferme sans erreur:

pax -rf filename.tar
Zac Thompson
la source
Malheureusement, cela ne semble pas arrêter les avertissements relatifs aux mots clés d'en-tête étendu lors de la suppression de la présentation de gnutar.
JJC
Ni l'un ni l'autre ne semble fonctionner sur Yosemite ( tar --versionindique bsdtar 2.8.3 - libarchive 2.8.3). Aussi, j'ai besoin d'un tiret avant cfdans ce dernier cas.
triple-
4

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_profilepour mettre à jour

De plus, OSX est livré avec les fichiers tar GNU et BSD. Ainsi, vous pouvez également dissocier l’arbitre de tar de bsd à gnu:

sudo unlink /usr/bin/tar;
sudo ln -s /usr/bin/gnutar /usr/bin/tar
Du3
la source
1
Pourquoi dans /etc/hosts? /etc/hostsest pour mappage hôte / IP, non?
BenjiWiebe
1
ce que @BenjiWiebe a dit. Le bit encore plus étrange est l'édition de / etc / hosts. Je pense que vous vouliez dire ~ / .bashrc
Dave Dopson le
2
Sous OS X, .bashrcn'est pas chargé pour les sessions Terminal. Vous avez besoin .bash_profile, car un shell de connexion est démarré avec une nouvelle fenêtre de terminal. / cc @BenjiWiebe
slhck le
Correct :-) Je travaillais aussi dans / etc / hosts à ce moment-là, donc ça crachait sur le clavier. Bonne prise
Du3
2

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

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/[votre_domaine//profile

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

Quittez et relancez la fenêtre de votre terminal.

comment
la source
1

Oui, le binaire tar intégré à 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 ça t'as aidé!

Shaheen Ghiassy
la source
C'est une façon. J'ai résolu le problème GNU / BSD de manière plus complète dans github.com/ddopson/dotfiles . J'ai ~ / bin / coreutils au début du chemin et il y a de petites cales telles que github.com/ddopson/dotfiles/blob/master/bin/coreutils/tar qui sélectionnent le bon exécutable basé sur linux vs Mac et si l'environnement COREUTILS variable est définie
Dave Dopson
Vous voudrez peut-être modifier vos instructions pour demander aux personnes de vérifier l'existence de / usr / bin / gnutar avant de déplacer leur goudron de travail. Les débutants peuvent trouver cela en utilisant Google et ne pas savoir comment décomposer leur système.
msouth
Ce n'est probablement pas une bonne idée, pour deux raisons. 1) Maintenant, les paquets Apple ne savent pas où trouver le fichier tar natif, le fichier tar qui sait comment gérer les attributs de fichier Apple. 2) Si vous devez utiliser GNU tar, vous devez le placer avant votre chemin de recherche, par exemple, / usr / local / bin ou autre chose, et 3) il est probablement plus sûr d'appeler le tarprogramme étranger gnutar pour éviter toute confusion de logiciel. s'attendre à ce qu'un Mac se comporte comme un Mac. 0,02 $. -Erik
Erik Bennett
0

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

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

Edit: Vous êtes sur le système Mac, j'ai pensé autrement. Vous devrez utiliser gnutar, il devrait déjà être installé, sinon installez-le. Bien sûr, vous pouvez regarder d'autres liens en cherchant vous-même.

Sudhi
la source
0

Sous 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 vos archives avec le format pax

tar -c --format pax -f your_tar_file files
msadek
la source