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 😊
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
Merci ! Je t’avoue que mes astuces sur GNU/Linux sont un peu limitées 🙂