2008-09-18 14 views
14

Quiero descargar muchas URL en un script, pero no quiero guardar las que generan errores HTTP.¿Hay una opción curl/wget que indique que no se guardan los archivos tras errores http?

Por lo que puedo decir de las páginas man, ni curl ni wget proporcionan tal funcionalidad. ¿Alguien sabe acerca de otro descargador que lo hace?

+3

Por lo que yo puedo ver OCT es la única persona que realmente leer la pregunta y contestó. Todos los demás te dieron técnicas que * nunca * descargarían nada, o dijeron que hicieras tu propio. ¿No debería aceptar la única respuesta * real * que le dieron? – iconoclast

Respuesta

13

Un forro acabo de configuración para este mismo propósito:

(sólo funciona con un solo archivo, podría ser útil para los demás)

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

Este intentará descargar el archivo desde el host remoto. Si hay un error, el archivo no se guarda. En todos los demás casos, se mantiene y renombra.

+0

¿Quiso decir "si hay * un * error, el archivo no se guarda"? De lo contrario, hiciste lo contrario de lo que se solicitó. – iconoclast

+0

de hecho! lo arreglaré :) – Oct

11

creo que la opción -f-curl hace lo que quiere:

-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. [...]

Sin embargo, si la respuesta era en realidad un 301 o 302 de redirección, que todavía es salvo, incluso si su destino daría lugar a un error :

$ 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> 

para seguir la redirección a su salida, también dará la opción -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

no, solo está relacionado con la verbosidad de errores. una vez utilizado, los errores no se informan (pero se guardan como de costumbre) gracias de todos modos – akiva

+1

Esto es exactamente lo que quería ('curl -fO {URL}'). No guarda un archivo en un '404'.Gracias – hypercrypt

+1

@hypercrypt Tu comentario me confundió hasta que me di cuenta de lo que estaba pasando. Editado en una advertencia importante. – Thomas

2

hilo antiguo .. aterrizado aquí en busca de una solución ... terminaron escribiendo un código de shell para hacerlo.

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 

Esto descargará salida a un archivo tmp, y crear/sobrescribir archivo de salida sólo si el estado era un 200. Mi caso de uso es un poco diferente .. en mi caso, la salida toma> 10 segundos para generar ... y no quería que el archivo de destino permaneciera en blanco durante ese tiempo.

0

Tengo una solución para proponer, descarga el archivo pero también lo elimina si su tamaño es 0 (lo que sucede si se produce un 404).

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

Funciona para zsh pero puede adaptarlo para otros proyectiles.

Pero sólo lo guarda en primer lugar si se proporciona la opción -O

Cuestiones relacionadas