2008-09-18 4 views
14

Je veux télécharger beaucoup d'urls dans un script mais je ne veux pas enregistrer ceux qui conduisent à des erreurs HTTP.Y at-il une option curl/wget qui dit de ne pas enregistrer les fichiers sur les erreurs http?

Pour autant que je puisse dire à partir des pages de manuel, ni curl ni wget n'offrent une telle fonctionnalité. Est-ce que quelqu'un sait à propos d'un autre téléchargeur qui le fait?

+3

Pour autant que je peux voir est la seule octobre personne qui a réellement lu la question et a répondu. Tout le monde vous a donné des techniques qui ne téléchargeraient jamais rien, ou ils ont dit de rouler les vôtres. Ne devriez-vous pas accepter la seule réponse * réelle * qui vous a été donnée? – iconoclast

Répondre

13

une doublure Je viens configuration dans ce but:

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

A=$$; (wget -q "http://foo.com/pipo.txt" -O $A.d && mv $A.d pipo.txt) || (rm $A.d; echo "Removing temp file") 

Cela va tenter de télécharger le fichier 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é.

+0

Voulez-vous dire "s'il y a une erreur * *, le fichier n'est pas conservé"? Sinon, vous avez fait le contraire de ce qui a été demandé. – iconoclast

+0

en effet! va corriger ça :) – Oct

11

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

-f , --fail

(HTTP) Fail silently (no output at all) on server errors. This is mostly done to better enable scripts etc to better deal with failed attempts. In normal cases when an HTTP server fails to deliver a document, it returns an HTML document stating so (which often also describes why and more). This flag will prevent curl from outputting that and return error 22. [...]

Cependant, si la réponse était en fait un 301 ou 302 redirect, qui obtient encore sauvé, 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 à son impasse, donne également l'option -L:

-L , --location

(HTTP/HTTPS) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response code), this option will make curl redo the request on the new place. [...]

+0

non, c'est seulement lié à la verbosité des erreurs. une fois utilisé, les erreurs ne sont pas signalées (mais enregistrées comme d'habitude) merci quand même – akiva

+1

C'est exactement ce que je voulais («curl -fO {URL}'). Il n'enregistre pas un fichier sur un '404'.Merci – hypercrypt

+1

@hypercrypt Votre commentaire m'a embrouillé jusqu'à ce que je réalise ce qui se passait. Edité dans une mise en garde importante. – Thomas

-1

Vous pouvez télécharger le fichier sans enregistrer en utilisant l'option "-O -" comme

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

Vous pouvez obtenir des informations mor à http://www.gnu.org/software/wget/manual/wget.html#Advanced-Usage

+3

Ce n'est * pas * ce que le PO a demandé. Il a demandé un moyen de ne pas télécharger les fichiers * s'il y a une erreur *. Votre réponse ne télécharge * rien, jamais *. – iconoclast

2

fil ancien .. atterri ici à la recherche d'une solution ... fini é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 

Cela télécharger vers un fichier tmp et créer/écraser le fichier de sortie que si le statut était un 200. Mon usecase 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 pour cette durée.

0

J'ai une solution de contournement à proposer, il télécharge le fichier mais il le supprime également si sa taille est 0 (ce qui arrive 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 coques.

Mais il enregistre seulement en premier lieu si vous fournissez l'option -O

Questions connexes