31 votes

Pourquoi extraire ce tgz génère une erreur sur mon Mac mais pas sur Linux?

Je rencontre un problème plutôt étrange, et je n'arrive pas à comprendre ce qui se passe. J'ai un fichier tgz, scip-3.2.0.tgz, qui génère une erreur lorsque j'essaie de le décompresser. L'erreur se produit uniquement sur OS X (je suis sur 10.10.4). Je peux extraire le fichier sans erreur sur une machine Linux exécutant CentOS 6.6. L'erreur se produit à la fois en utilisant la commande en ligne tar et en utilisant l'utilitaire d'archive. J'ai envoyé un e-mail à la liste de diffusion SCIP, et j'ai le même hachage SHA-1 qu'un autre utilisateur (e085a4a3591eddf945dcb365d97d2512c267e374), donc il n'y avait pas d'erreur de téléchargement. Ils ne savent pas ce qui se passe.

Voici l'erreur que j'obtiens lorsque j'essaie de décompresser en utilisant l'utilitaire d'archive :

archive utility error

Juste au cas où l'image se briserait un jour, le texte dans l'image dit ceci :

Impossible de développer "scip-3.2.0.tgz" dans "Bureau".
(Erreur 1 - Opération non autorisée.)

Et lorsque j'essaie de décompresser via la ligne de commande, voici la sortie que j'obtiens. C'est la dernière ligne (tar: Error exit delayed from previous errors.) qui me préoccupe. Je ne vois pas ce qui la provoque. L'archive semble s'extraire sans problème, mais je n'ai pas confiance en elle avec cette erreur.

Est-ce que quelqu'un sait ce qui cause cela?

[éditer]
En regardant de plus près la sortie, la ligne 1108 contient l'erreur :

x scip-3.2.0/applications/Coloring/Makefile: Can't create 'scip-3.2.0/applications/Coloring/Makefile'

2 votes

Est-ce que cela fonctionne avec une autre application comme Unarchiver ? wakaba.c3.cx/s/apps/unarchiver.html

0 votes

Oui, cela fait! Je me demande ce qu'ils font différemment. Une partie du problème est que j'ai un script bash qui automatise un tas de choses, et l'une des choses qu'il doit faire est d'extraire ce tgz pour qu'il puisse construire ce qui se trouve à l'intérieur. Je me demande s'il y a un bug dans la commande tar fournie avec OS X.

1 votes

Peut-être qu'il y a un bug. J'ai trouvé l'utilitaire d'archivage intégré d'OS X assez nul. N'y a-t-il aucun moyen de réarchiver les fichiers nécessaires dans un zip ou quelque chose comme ça? De plus, si vous mettez en place un script, l'erreur se produit-elle également lorsque vous gunzip -c scip-3.2.0.tgz | tar xopf - à partir de la ligne de commande, comme vous l'utiliseriez pour votre script?

42voto

Adam Liter Points 874

Cela devrait aider à identifier ce qui se passe dans la réponse de Johnny, ainsi que répondre à la question de pourquoi cela fonctionne sur Linux mais pas sur Mac.

Le problème réside dans le fait que Mac OS X utilise bsdtar, tandis que la plupart des systèmes Linux utilisent gnutar.

Vous pouvez installer gnutar sur un Mac avec Homebrew, en utilisant brew install gnu-tar, qui créera un lien symbolique de gnutar dans /usr/local/bin en tant que gtar.

Si vous installez gnutar, vous pouvez reproduire le problème en suivant les étapes de la réponse de Johnny.

$ brew install gnu-tar
==> Téléchargement de https://homebrew.bintray.com/bottles/gnu-tar-1.28.yosemite.bottle.2.tar.gz
######################################################################## 100.0%
==> Écoulement de gnu-tar-1.28.yosemite.bottle.2.tar.gz
==> Remarques
gnu-tar a été installé sous le nom "gtar".

Si vous avez vraiment besoin de l'utiliser en tant que "tar", vous pouvez ajouter un répertoire "gnubin"
à votre PATH à partir de votre bashrc comme suit :

    PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
==> Résumé
  /usr/local/Cellar/gnu-tar/1.28: 13 fichiers, 1.6M
$ mkdir test
$ touch test/a test/b
$ gtar -zcvf test.tar.gz test test/a # créer l'archive avec 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 lien vers test/a
$ rm -r test
$ tar -xvf test.tar.gz # essayer de déballer l'archive avec bsdtar
x test/
x test/a
x test/b
x test/a: Impossible de créer 'test/a'
tar: L'erreur d'arrêt est retardée par rapport aux erreurs précédentes.
$ echo $?
1

Il est évident que gnutar archive les choses différemment d'une manière qui fait que bsdtar s'étouffe sur les doublons. Le fait que gtar -ztvf test.tar.gz indique que la deuxième instance de test/a est archivée sous la forme d'un lien vers test/a est pertinent. Comme Johnny le souligne dans les commentaires, gnutar stocke les doublons sous forme de liens physiques au lieu du fichier réel, ce qui peut être désactivé avec --hard-dereference.

C'est-à-dire, vous pourriez faire ce qui suit :

$ 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 # notez que ce n'est plus un lien
$ rm -r test
$ tar -xvf test.tar.gz # déballer avec bsdtar
x test/
x test/a
x test/b
x test/a
$ echo $?
0
$ ls test/
a b

Cependant, dans ce cas, vous ne contrôlez évidemment pas la création du fichier tar, donc --hard-dereference n'est pas une option. Heureusement, d'après la réponse de l'OP, il semble que ce problème ait été résolu par les développeurs.

Néanmoins, si quelqu'un d'autre rencontre ce problème à l'avenir et a besoin d'une solution rapide ou si le mainteneur en amont ne répond pas, il existe une solution de contournement.

Une fois que vous avez identifié le fichier en double, vous pouvez utiliser l'option --fast-read de bsdtar (notez que cette option fait uniquement partie de bsdtar, pas de gnutar) :

 -q (--fast-read)
         (mode x et t uniquement) Extraire ou lister uniquement la première entrée d'archive qui correspond à chaque motif ou opérande de nom de fichier. Sortez dès que chaque motif ou opérande de nom spécifié a été associé. Par défaut, l'archive est toujours lue jusqu'à la fin, car il peut y avoir plusieurs entrées avec le même nom et, par convention, les entrées ultérieures écrasent les entrées antérieures. Cette option est fournie en tant qu'optimisation des performances.

Ainsi, dans l'exemple simplifié que j'ai créé suivant l'exemple simplifié dans la réponse de Johnny, le fichier en double est test/a. Ainsi, vous pourriez éviter ce problème en faisant ce qui suit :

# cette série de commandes fait suite à la première série de commandes
# autrement dit, ce qui suit suppose un fichier tar qui n'a pas été créé avec
# l'option --hard-dereference, bien que cela fonctionnera tout aussi bien
# avec l'option activée
$ tar -xvqf test.tar.gz test/a # décompresser la première instance de test/a
x test/a
$ tar -xvf test.tar.gz --exclude test/a # décompresser tout sauf test/a
x test/
x test/b
$ echo $?
0
$ ls test/
a b

Remarquez également que gnutar peut parfaitement décompresser une archive avec des doublons qui a été créée par lui-même, même lorsque l'option --hard-dereference n'a pas été utilisée :

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

Ainsi, cela répond à votre question de pourquoi une erreur est générée sur Mac mais pas sur Linux. La plupart des distributions Linux embarquent gnutar, et puisque le fichier tar a probablement été empaqueté avec gnutar, il n'y aura pas d'erreur lors du déballage avec gnutar, mais il y en aura une lors du déballage avec bsdtar.


Pour plus de lecture et de référence, on peut consulter Quelles sont les différences entre bsdtar et GNU tar? sur Unix.SE.

0 votes

Wow, belle enquête, je n'avais aucune idée qu'il y avait une différence significative entre gnutar et bsd tar. Basé sur votre gtar -tcvf, gnutar est "intelligent" assez pour optimiser le deuxième fichier comme un lien au lieu de le dupliquer dans l'archive.

0 votes

Après avoir parcouru la documentation, il semble que cela soit un effet secondaire de la gestion des liens physiques de gtar. Il semble penser que le fichier en double est en réalité un lien physique vers le fichier, donc il le stocke comme un lien au lieu du fichier réel. En donnant à gtar l'option --hard-dereference, cela désactive ce comportement.

0 votes

@Johnny Ce sont vraiment deux des mainteneurs de Homebrew qui ont résolu ce problème (Misty De Meo et Dominyk Tiller). Un des développeurs du logiciel que j'utilise a publié une nouvelle version avec un fichier en double dans le fichier tar, ce qui a causé des problèmes lors de l'installation de la nouvelle version avec Homebrew (évidemment). Quoi qu'il en soit, merci d'avoir consulté la documentation ! Je vais ajouter cela à la réponse.

8voto

Johnny Points 196

L'existence d'un fichier en double dans l'archive ne devrait pas la rendre invalide ou incapable d'être extraite sur OSX, car par défaut, tar écrase les doublons.

Donc, je suis un peu confus par le comportement dans votre Gist - tar sur OSX permet les fichiers en double dans une archive (un retour à sa finalité originale en tant qu'utilitaire d'archivage de bande.ar, donc il permet aux fichiers d'être ajoutés à la fin de l'archive bandes, et lorsque l'archive est restaurée, la version la plus récente du fichier écrase la ou les versions précédentes)

C'est seulement lorsque l'option "-k" est présente que tar devrait avertir des fichiers préexistants.

Ici, j'ai créé une archive avec un fichier en double puis je l'ai extraite sans problème. Ce n'était que lorsque j'ai ajouté l'option -k qu'il m'a averti du fichier en double :

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

Un simple problème de umask ne semble pas être le coupable non plus, j'ai essayé de changer mon umask en 0777 et je peux toujours extraire l'archive :

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

J'ai pensé pouvoir reproduire le problème en ajoutant délibérément un répertoire non inscriptible à l'archive, mais cela n'a pas fonctionné, tar n'a pas mis à jour les permissions sur le répertoire lors de l'extraction de l'archive :

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> 

J'ai également essayé de changer les permissions sur test/a en 000, de l'ajouter à l'archive, puis d'ajouter un autre test/a, mais celui-là a également fonctionné correctement :

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

Donc j'aimerais vraiment voir l'archive d'origine qui a causé le problème et voir ce qui aurait pu être dans cette archive pour causer ce problème.

Si un nom de fichier et un répertoire partagent le même nom, tar a effectivement un problème d'extraction, mais il affiche un message d'erreur assez clair :

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.

(si le conflit se produit dans l'autre sens, c'est-à-dire si un fichier vient en premier, puis un répertoire portant le même nom vient plus tard, tar le supprime simplement et crée le répertoire :

Macbook> tar -xvf test.tar
x test/
x test/dir1
x test/
x test/dir1/
x test/dir1/a

0 votes

Salut Johnny, cela ne semble pas répondre à la question. Quelle est la solution que tu proposes à la question? Si tu pouvais éditer ta réponse pour donner un détail étape par étape, ce serait génial. Sinon, cela pourrait être mieux comme un commentaire sur une autre réponse fournie comme information contextuelle.

1 votes

J'ai rendu un peu plus clair le comportement dans son Gist (et sa réponse personnelle) ne semble pas être la réponse complète car les fichiers en double sont autorisés dans une archive tar. Donc, la réponse à "Je ne peux pas décompresser une archive tar avec un fichier en double" ne devrait pas être "Supprimez le fichier en double" car tar est censé pouvoir gérer ce cas.

0 votes

Johnny - compris, et j'apprécie le contexte donné sur la situation. Comme il semble s'agir davantage d'une méthode de reproduction du problème plutôt que d'une solution, je suppose toujours qu'il serait peut-être préférable de le voir comme un commentaire à la réponse personnelle au lieu d'une réponse en soi - bien que utile, il ne tente toujours pas de résoudre le problème au-delà d'expliquer que le problème est uniquement un doublon (par exemple, il n'y a pas de mesures de remédiation incluses pour aborder comment l'utilisateur pourrait contourner le problème, etc). Excellent détail, cependant!

7voto

Geoff Points 505

Il s'avère que l'utilitaire tar OS X était le bon! Il y avait en effet une erreur dans l'archive. Cette discussion par email en parle en détail, mais le problème est que il y a un fichier en double dans l'archive. Les gars de SCIP sont en train de corriger l'archive pendant que j'écris ceci.

[edit]
Le fichier scip-3.2.0.tgz nouvellement mis à jour s'extrait correctement! Le hash SHA-1 du nouveau tgz est 5b4e8283f4a5bf9e50f9a62d4320d6f5f50c8476.

[edit 2]
Ce n'est pas qu'il y ait une erreur dans l'archive. C'est simplement que bsdtar, qui est fourni avec OS X, gère les fichiers en double différemment de gnutar, qui est fourni avec Linux. La réponse de @Adam Liter ici fournit une explication détaillée de ce qui se passe.

1 votes

Intéressant. Donc peut-être que les autres utilitaires ignoraient l'erreur de fichier en double et avançaient sans se plaindre? Quoi qu'il en soit, je suis content que vous ayez trouvé la cause et la réponse.

1 votes

Oui, je pense que c'est exactement ce que font les autres utilitaires. Je soutiendrais que l'utilitaire tar OS X est le bon choix ici. Une archive mal formée devrait toujours au moins déclencher un avertissement pour alerter l'utilisateur que quelque chose ne va pas. Merci pour votre aide!

0 votes

Un fichier en double dans une archive tar ne la rend pas invalide, le format tar permet spécifiquement les doublons. Je m'interroge sur pourquoi votre terminal mac a refusé de décompresser l'archive même si vous n'avez pas spécifié l'option -k, qui aurait dû l'avertir des fichiers préexistants. Malheureusement, ils ont déjà mis à jour le fichier scip-3.2.0.tgz pour supprimer le doublon, alors je ne peux pas tester cette archive.

2voto

ThisClark Points 294

Il existe une alternative, un logiciel d'archivage gratuit et léger que j'utilise pour Mac OSX. Il s'appelle Keka et je l'utilise pour décompresser principalement les fichiers 7zip. De plus, il peut décompresser d'autres types comme les fichiers .rar, .tar, .gz, etc. Il a également fonctionné pour le fichier tar spécifique de l'OP, mais je l'ai essayé après que @Geoff ait mentionné que l'équipe travaillait à réparer le fichier.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X