Bonjour,
j'ai besoin de vérifier l'intégrité d'un fichier dans un tar en utilisant la md5sum contenue dans un autre fichier de ce tar, et ce à la volée (je ne veux pas copier le fichier à vérifier sur le disque)
Y'a-t-il un moyen simple de faire ça ?
A la limite je peux générer le md5 de mon fichier a vérifier et la comparer avec celle contenue dans l'autre fichier en utilisant sed, awk ou je ne sais quoi, mais ça serait dommage.
Merci d'avance.
# Première idée
Posté par Johands . Évalué à 2.
johan:MegaBook /tmp $ tar tf toto.tar.gz
toto/
toto/winrg.swf.md5
toto/winrg.swf
johan:MegaBook /tmp $ tar xzf toto.tar.gz toto/winrg.swf.md5 -O
7f4570b06987fb9baf8f05169198f224 winrg.swf
johan:MegaBook /tmp $ tar xzf toto.tar.gz toto/winrg.swf -O | md5sum
7f4570b06987fb9baf8f05169198f224 -
Mais si tu cherches à faire md5sum -c directement, c'est une autre histoire.
[^] # Re: Première idée
Posté par SimaHWT . Évalué à 0.
# Une solution possible...
Posté par Jérôme Pinot (site web personnel) . Évalué à 5.
$ tar tf plop.tar.gz
plop/
plop/truc
plop/truc.md5
$ tar xzf plop.tar.gz plop/truc -O | md5sum | grep -q `tar xzf plop.tar.gz plop/truc.md5 -O|cut -d" " -f1` && echo OK || echo FAIL
Ça sort OK si le md5 correspond, FAIL sinon.
[^] # Re: Une solution possible...
Posté par SimaHWT . Évalué à 1.
merci beaucoup, c'est classe aussi.
# Il faut plusieurs lignes
Posté par Kerro . Évalué à 2.
(
MD5_PRECALCULE=$(tar --extract --to-stdout --file archive.tar rep/toto.md5 | cut --delimiter=' ' --fields=1)
MD5_ACTUEL=$(tar --extract --to-stdout --file archive.tar rep/toto.txt | md5sum | cut --delimiter=' ' --fields=1)
if [[ "$MD5_PRECALCULE" == "$MD5_ACTUEL" ]];
then echo ouiiii
else
echo nooooon
fi
)
Inconvénient: l'archive est lue deux fois. Donc si elle est grosse et que tes fichiers sont situés à la fin, c'est un problème.
Si tu veux optimiser, tu peux utiliser quelque chose du genre:
tar --extract --to-stdout --verbose --file archive.tar 'rep/toto.txt' 'rep/toto.md5'
Il faut alors envoyer la sortie vers tee afin afin de lire le contenu de chaque fichier et de le traiter correctement avec sed ou awk.
[^] # Re: Il faut plusieurs lignes
Posté par Phil Actaire . Évalué à 2.
Et puis la lecture préliminaire du fichier contenant le hash permet éventuellement d'obtenir le chemin/nom du fichier à vérifier.
C'est plus générique.
# On récupère les paramètres
ARCHIVE="${1}"
SUMFILE="${2}"
# On lit le hash et le nom de fichier
MD5SUM=$(tar --extract --to-stdout --file ${ARCHIVE} ${SUMFILE})
MD5=$(expr "$MD5SUM" : "\([0-9a-fA-F]*\) .")
FNAME=$(expr "$MD5SUM" : "${MD5} .\(.*\)$")
# On vérifie
tar --extract --to-stdout --file ${ARCHIVE} "${FNAME}" | md5sum -c "${MD5} -" # Attention, 2 espaces entre MD5 et -
On lit toujours 2 fois l'archive mais c'est réutilisable.
Bien sûr, il est nécessaire que le chemin indiqué dans le md5 corresponde à celui de l'archive sinon on modifie le chemin à la volée...
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.