Existe-t-il une option curl/wget qui indique de ne pas enregistrer les fichiers en cas d'erreurs http ?

StackOverflow https://stackoverflow.com/questions/89989

  •  01-07-2019
  •  | 
  •  

Question

Je souhaite télécharger beaucoup d'urls dans un script mais je ne souhaite pas enregistrer celles qui conduisent à des erreurs HTTP.

Pour autant que je sache d'après les pages de manuel, ni l'un ni l'autre curl ou wget fournir une telle fonctionnalité.Est-ce que quelqu'un connaît un autre téléchargeur qui le fait ?

Était-ce utile?

La solution

Une doublure que je viens de configurer à cette fin:

(fonctionne 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 "Removing temp file")

Ceci tentera de télécharger le fichier à partir de 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é.

Autres conseils

Je pense que le -f possibilité de curl fait ce que tu veux :

-f, --fail

(HTTP) Échec silencieux (aucune sortie du tout) en cas d'erreurs de serveur.Cela est principalement fait pour mieux permettre aux scripts, etc. de mieux gérer les tentatives infructueuses.Dans les cas normaux, lorsqu'un serveur HTTP ne parvient pas à livrer un document, il renvoie un document HTML le déclarant (qui décrit souvent également pourquoi et plus).Cet drapeau empêchera Curl de sortir de cette erreur et de retour 22.[...]

Cependant, si la réponse était en réalité une redirection 301 ou 302, elle sera quand même enregistrée, même si sa destination entraînerait une erreur :

$ curl -fO http://google.com/aoeu
$ cat aoeu
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/aoeu">here</A>.
</BODY></HTML>

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

-L, --location

(HTTP / HTTPS) Si le serveur rapporte que la page demandée a déménagé à un autre emplacement (indiqué par un emplacement:En-tête et un code de réponse 3xx), cette option fera que Curl refait la demande sur le nouvel endroit.[...]

Un fil ancien… a atterri ici à la recherche d'une solution… a fini par écrire du code shell pour le faire.

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

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

J'ai une solution de contournement à proposer, il télécharge le fichier mais le supprime également si sa taille est 0 (ce qui se produit si un 404 se produit).

wget -O <filename> <url/to/file>
if [[ (du <filename> | cut -f 1) == 0 ]]; then
    rm <filename>;
fi;

Cela fonctionne pour zsh mais vous pouvez l’adapter pour d’autres shells.

Mais cela ne l'enregistre qu'en premier lieu si vous fournissez l'option -O

REMARQUE: je suis conscient du fait qu'il s'agit d'une question plus ancienne, mais je pense avoir trouvé une meilleure solution pour ceux qui utilisent wget qu'aucune des réponses ci-dessus ne fournit.

wget -q $URL 2>/dev/null

Sauvegardera le fichier cible dans le répertoire local si et seulement si le code d'état HTTP est compris entre 200 (Ok).

En outre, si vous souhaitez faire quelque chose comme imprimer une erreur chaque fois que la demande rencontre une erreur, vous pouvez vérifier la code de sortie wget pour les valeurs non nulles telles que:

wget -q $URL 2>/dev/null
if [ $? != 0]; then
    echo "There was an error!"
fi

J'espère que cela sera utile à quelqu'un qui fait face aux mêmes problèmes que moi.

Mise à jour: Je viens de mettre cela dans une forme plus scriptable pour mon propre projet, et je pensais partager:

function dl {
    pushd . > /dev/null
    cd $(dirname $1)
    wget -q $BASE_URL/$1 2> /dev/null
    if [ $? != 0 ]; then
        echo ">> ERROR could not download file \"$1\"" 1>&2
        exit 1
    fi
    popd > /dev/null
}

Vous pouvez télécharger le fichier sans l'enregistrer à l'aide de l'option "-O -" "sous

.
wget -O - http://jagor.srce.hr/

Vous pouvez obtenir plus d'informations à l'adresse http: // www. gnu.org/software/wget/manual/wget.html#Advanced-Usage

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top