Header error lors d'un tar x sur une archive splitée

Hier, j'ai transféré plusieurs Go de données sur un serveur distant sous Debian 10, sous forme d'une archive tar splitée en fichiers de 4 Mo. J'avais donc dans mon répertoire de destination un peu plus de 1000 fichiers au format MonArchive.tar.001.

Je tente un merge avec cat de ces fichiers afin d'avoir une seule grosse archive tar que je peux ensuite extraire.

cat MonArchive.tar.* > MonArchive.tar

Puis je tente une extraction :

tar xvf MonArchive.tar

Et je me heurte à une erreur d'header lors de l'extraction, s'arrêtant net après le troisième fichier sur une vingtaine présente dans l'archive. Je retente un cat et un tar mais sans succès. Ayant encore les fichiers d'origine sur ma station Windows, je décide donc de faire un comparatif des checksums respectifs pour m'assurer qu'il n'y ait pas de fichier qui ait été mal transféré.

Sur mon système Debian :

sha256sum MonArchive.tar.* > MonArchiveChecksum

Sous Windows, grâce à Powershell :

Get-FileHash * -Algorithm SHA256

Je récupère donc mes extractions, ouvre un Notepad++ et compare les fichiers : aucune différence de checksum. Je suis donc un peu surpris car cela veut dire que les fichiers sont a priori identiques entre la destination et la source. En conclusion, le problème semble se situer au niveau du merge de mes multiples archives.

Au détour d'un banal ls sur mon système Debian, j'ai compris d'où venait le problème. A l'heure où j'écris cet article (il était 1 heure du matin quand je me suis penché sur le sujet 😅), je n'ai plus les archives sur mon système Debian mais je les ai régénérées sur mon système Windows, et la cause est identique. Voici le résultat d'une commande ls sur Powershell :

Les fichiers étaient nommés MonArchive.tar.001, MonArchive.tar.002 jusque MonArchive.tar.1032. On passe donc une numérotation sur 3 chiffres à 4 en arrivant au millier ; ce qui va fatalement poser problème pour cat puisqu'il fusionne les fichiers par ordre alphabétique. Or, par ordre alphabétique, il y a donc MonArchive.tar.100, MonArchive.tar.1000, MonArchive.tar.1001, MonArchive.tar.1002... avant de finalement continuer sur MonArchive.tar.101, MonArchive.tar.1010. Par conséquent, l'archive est mal constituée puisque pas concaténée dans l'ordre : cela ne serait pas arrivé si toute la numérotation avait été faite sur 4 chiffres dès le départ (7-zip pour Windows est l'outil de compression d'origine).

J'ai donc procédé en plusieurs étapes : isolation des fichiers tar à 4 chiffres, concaténation d'une première archive avec les 999 premiers fichiers tar, puis concaténation d'une deuxième archive avec les derniers fichiers, et enfin fusion des deux archives pour extraction. Ensuite, j'ai pu vérifier l'intégrité apparente de l'archive finale :

tar tvf MonArchiveFinale.tar

Tous les fichiers lisibles de l'archive sont apparus, j'ai donc pu les extraire 😊

Lien pour marque-pages : Permaliens.

2 Commentaires

  1. Stéphane LEPREVOST

    En bon Linuxien j'ai pigé ton problème dès que j'ai vu ton cat * 😉

    Une solution rapide : utiliser l'option-t du ls pour générer une liste chronologique et boucler dessus.

    Un ancien collègue

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.