web-dev-qa-db-fra.com

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

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, notamment 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?

103
Dave Dopson

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

Installez GNU tar si vous le pouvez sous Mac OS et utilisez-le pour créer la tar.

67
holygeek

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 gtar pour la compatibilité linux.


Si vous voulez remplacer tar par 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 en remplaçant which gtar par which bsdtar.

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

57
spuder

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
26
Chris

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.tar est le fichier tar à extraire.

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

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

10
daka
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 tar OS X?


Edit: il semble que cela puisse uniquement arrêter la création des fichiers non désirés de type ._foo-, mais pas la création de l'en-tête (du moins sous 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 répertoire PaxHeader, mais au moins se ferme sans erreur:

pax -rf filename.tar
5
Zac Thompson

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

alias tar='gnutar'

et lancez source ~/.bash_profile pour mettre à jour

De plus, OSX est livré avec GNU et BSD tar. 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
4
Du3

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.

2
howdytom

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 cela pourra aider!

1
Shaheen Ghiassy

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 un système Mac, je pensais 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.

0
Sudhi

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
0
msadek