¿Existe una opción curl/wget que indique no guardar archivos en caso de errores http?

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

  •  01-07-2019
  •  | 
  •  

Pregunta

Quiero descargar muchas URL en un script, pero no quiero guardar las que generan errores HTTP.

Por lo que puedo ver en las páginas de manual, tampoco curl o wget proporcionar dicha funcionalidad.¿Alguien sabe acerca de otro programa de descarga que lo haga?

¿Fue útil?

Solución

Una línea que acabo de configurar para este mismo propósito:

(funciona sólo con un único archivo, puede ser útil para otros)

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

Esto intentará descargar el archivo desde el Host remoto.Si hay un Error, el archivo no se conserva.En todos los demás casos, se conserva y se le cambia el nombre.

Otros consejos

Pienso que el -f opción de curl hace lo que quieres:

-f, --fail

(HTTP) Falla silenciosamente (sin salida alguna) en errores del servidor.Esto se hace principalmente para habilitar mejor los scripts, etc. para tratar mejor los intentos fallidos.En casos normales, cuando un servidor HTTP no puede entregar un documento, devuelve un documento HTML que indique SO (que a menudo también describe por qué y más).Este indicador evitará que el curlmente salga de eso y devuelva el error 22.[...]

Sin embargo, si la respuesta fue en realidad una redirección 301 o 302, aún se guarda, incluso si su destino generarí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 hasta su callejón sin salida, proporcione también el -L opción:

-L, --location

(Http/https) si el servidor informa que la página solicitada se ha movido a una ubicación diferente (indicada con una ubicación:encabezado y un código de respuesta 3xx), esta opción hará que Curl rehace la solicitud en el nuevo lugar.[...]

Hilo antiguo..Aterricé aquí buscando una solución...Terminé escribiendo un código 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á la salida a un archivo tmp y creará/sobrescribirá el archivo de salida solo si el estado era 200.Mi caso de uso es ligeramente diferente.en mi caso, la salida tarda > 10 segundos en generarse...y no quería que el archivo de destino permaneciera en blanco durante ese tiempo.

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

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

Funciona para zsh pero puedes adaptarlo a otros shells.

Pero sólo lo guarda en primer lugar si proporcionas el -O opción

NOTA: Soy consciente de que esta es una pregunta anterior, pero creo que he encontrado una mejor solución para quienes usan wget que cualquiera de las respuestas anteriores proporciona.

wget -q $URL 2>/dev/null

Guardará el archivo de destino en el directorio local si y sólo si el código de estado HTTP está dentro del rango 200 (Ok).

Además, si desea hacer algo como imprimir un error cada vez que la solicitud recibe un error, puede verificar el código de salida wget para valores distintos de cero como este:

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

Espero que esto sea útil para alguien que enfrente los mismos problemas que yo.

Actualizar:Simplemente puse esto en una forma más compatible con secuencias de comandos para mi propio proyecto y pensé en compartirlo:

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
}

Puede descargar el archivo sin guardarlo usando "-O -" opción como

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

Puedes obtener más información en http://www.gnu.org/software/wget/manual/wget.html#Advanced-Usage

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top