Existe-t-il une méthode de ligne de commande par laquelle je peux vérifier si un fichier téléchargé est complet ou cassé?

13

J'écris un script qui implique le téléchargement et la manipulation d'un fichier, et je veux m'assurer que le fichier n'est pas incomplet (en raison, par exemple, d'une connexion interrompue) avant de travailler dessus.

Clare
la source

Réponses:

10

La façon la plus courante de vérifier l'intégrité des fichiers téléchargés consiste à utiliser les sommes de contrôle MD5. Cela suppose que le site que vous téléchargez à partir des sommes de contrôle MD5 réellement publiées de leurs fichiers. Vous pouvez vérifier une somme de contrôle MD5 en créant votre propre somme de contrôle du fichier téléchargé et en la comparant à la somme de contrôle publiée. S'ils sont identiques, le fichier que vous avez téléchargé est complet et non altéré.

Si vous ne vous attendez pas à ce que le fichier que vous téléchargez change, vous pouvez précalculer une somme de contrôle et la coder en dur dans le script, mais si le fichier est mis à jour, la vérification échouera.

Pour créer une somme de contrôle MD5 d'un fichier exécuté md5sum myFile. Dans le cas de wget, vous pourriez trouver cette commande utile, surtout si le fichier que vous téléchargez est volumineux:

wget -O - http://example.com/myFile | tee myFile | md5sum > MD5SUM.

Cela créera une somme de contrôle de "monFichier" lors du téléchargement et l'enregistrera dans le fichier MD5SUM, ce qui vous fera peut-être gagner du temps.

Dans le cas d'une connexion interrompue, je pense que la meilleure façon serait de vérifier les codes de sortie de wget. Si le téléchargement réussit sans erreur, wget reviendra 0. Tout le reste indique que quelque chose s'est mal passé. Jetez un œil à la section "Statut de sortie" de man wget.

arnefm
la source
2
codes de sortie: gnu.org/software/wget/manual/html_node/…
mikeserv
7

Le code retour de la commande utilisée pour télécharger le fichier vous indiquera si la commande a été exécutée avec succès ou non. En règle générale, un code retour de 0 indique la réussite et tout nombre différent de zéro indique une erreur. Vous pouvez accéder au code retour via la $?variable.

Un exemple de base utilisant wgetirait:

#!/bin/bash

wget foo.tgz &> /dev/null

if [[ "$?" != 0 ]]; then
    echo "Error downloading file"
else
    echo "Success"
fi

&> /dev/nullredirige toute la sortie de wget vers /dev/nullc'est donc idéal pour les scripts MAIS cela rend les wgeterreurs de débogage plus difficiles.

Ruisseau
la source
4
vous pourriez faire à la place:wget -q ... || { handle ; error ; }
mikeserv
@mikeserv Je ne savais même pas que c'était là, belle touche
Creek
1
manje ne l'ai trouvé qu'en lisant pour répondre et les deux choses que j'allais dire étaient déjà là dans deux réponses - j'ai donc fait deux commentaires. Joli contact avec toi aussi.
mikeserv
Je m'attends à ce que cela ne fonctionne pas lorsqu'il est utilisé avec des proxys SOCKS comme tor.
CodesInChaos
1
@Creek Ce que je voulais dire, c'est wgetque le téléchargement pourrait être terminé, même s'il s'est cassé. Proxie des informations sur les connexions TCP rompues et les connexions TCP fermées, ce qui pose problème avec HTTP car il utilise TCP fermé comme marque de fin par défaut. C'est pourquoi j'ai ajouté une vérification si la taille du fichier de l'en-tête correspond à la taille du fichier téléchargé lorsque j'ai exécuté un téléchargement en masse. Je ne sais pas si wgetces vérifications de cohérence ou ce que la spécification http dit sur ce problème.
CodesInChaos