29 votes

Y a-t-il une option curl/wget qui empêche de sauvegarder les fichiers en cas d'erreurs http?

Je veux télécharger beaucoup d'URL dans un script mais je ne veux pas enregistrer celles qui provoquent des erreurs HTTP.

Autant que je sache d'après les pages de manuel, ni curl ni wget ne fournissent une telle fonctionnalité. Est-ce que quelqu'un sait s'il existe un autre gestionnaire de téléchargement qui le fait?

32voto

Thomas Points 63635

Je pense que l'option -f à curl fait ce que vous voulez:

-f, --fail

(HTTP) Échec silencieux (pas de sortie du tout) en cas d'erreurs serveur. Cela est principalement fait pour permettre aux scripts, etc., de mieux gérer les tentatives échouées. Normalement, lorsque qu'un serveur HTTP échoue à livrer un document, il renvoie un document HTML le déclarant ainsi (ce qui explique souvent aussi pourquoi). Ce drapeau empêchera curl de produire cette sortie et renverra l'erreur 22. [...]

Cependant, si la réponse était effectivement une redirection 301 ou 302, cela sera tout de même enregistré, même si sa destination entraînerait une erreur:

$ curl -fO http://google.com/aoeu
$ cat aoeu

301 Moved
301 Moved
Le document a été déplacé
ici.

Pour suivre la redirection jusqu'à son impasse, donnez également l'option -L:

-L, --location

(HTTP/HTTPS) Si le serveur indique que la page demandée a été déplacée vers un nouvel emplacement (indiqué avec un en-tête Location: et un code de réponse 3XX), cette option fera refaire la demande à curl au nouvel endroit. [...]

27voto

Tristan Havelick Points 8261

Pour faire cela avec wget:

sous unix, vous pouvez faire:

wget -O /dev/null example.com

tandis que sous windows l'équivalent est:

wget -O NUL example.com

15voto

Oct Points 829

Une ligne que j'ai juste mise en place pour ce but précis :

(ne fonctionne qu'avec un seul fichier, pourrait être utile pour d'autres)

A=$$; ( wget -q "http://foo.com/pipo.txt" -O $A.d && mv $A.d pipo.txt ) || (rm $A.d; echo "Suppression du fichier temporaire")

Cela tentera de télécharger le fichier depuis l'hôte distant. S'il y a une erreur, le fichier n'est pas conservé. Dans tous les autres cas, il est conservé et renommé.

3voto

lilome Points 1

Ancien fil de discussion.. arrivé ici cherchant une solution... fini par écrire un code shell pour le faire.

if [ `curl -s -w "%{http_code}" --compress -o /tmp/something \
      http://example.com/my/url/` = "200" ]; then 
  echo "youpi"; cp /tmp/something /chemin/vers/fichier/destination
fi

Cela téléchargera la sortie dans un fichier temporaire, et créera/écrasera le fichier de sortie uniquement si le statut était de 200. Mon cas d'utilisation est légèrement différent.. dans mon cas, la sortie prend plus de 10 secondes à générer... et je ne voulais pas que le fichier de destination reste vide pendant cette durée.

1voto

NOTE: Je suis conscient que cela est une question ancienne, mais je crois avoir trouvé une meilleure solution pour ceux qui utilisent wget que ce que les réponses ci-dessus fournissent.

wget -q $URL 2>/dev/null

Enregistrera le fichier cible dans le répertoire local uniquement si le code de statut HTTP est dans la plage des 200 (OK).

De plus, si vous voulez faire quelque chose comme afficher une erreur chaque fois que la requête rencontre une erreur, vous pouvez vérifier le code de sortie de wget pour des valeurs non nulles comme ceci :

wget -q $URL 2>/dev/null
if [ $? != 0]; then
    echo "Une erreur est survenue !"
fi

J'espère que cela sera utile à quelqu'un qui rencontre les mêmes problèmes que moi.

Mise à jour : Je viens de mettre ceci sous une forme plus scriptée pour mon propre projet, et j'ai pensé que je pourrais le partager :

function dl {
    pushd . > /dev/null
    cd $(dirname $1)
    wget -q $BASE_URL/$1 2> /dev/null
    if [ $? != 0 ]; then
        echo ">> ERREUR impossible de télécharger le fichier \"$1\"" 1>&2
        exit 1
    fi
    popd > /dev/null
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X