wget -o escribe archivos vacíos en caso de falla

14

Si escribo wget "no such address" -o "test.html" primero crea el test.html y, en caso de falla, lo deja vacío. Sin embargo, cuando no use -o, esperará para ver si la descarga se realiza correctamente y solo después de eso, escribirá el archivo.

Me gustaría que este último comportamiento se aplique también a -o, ¿es posible?

akurtser
fuente

Respuestas:

17

wget devuelve un estado de salida distinto de cero cuando no se encuentra la URL, por lo que puede agregar un comando de eliminación en caso de error:

wget "url" -O file || rm -f file

O cree un archivo temporal y muévalo solo donde desee en caso de éxito:

wget "url" -O /tmp/wget && mv /tmp/wget file

El segundo tiene el beneficio de no eliminar un archivo existente en caso de falla, pero asegúrese de usar nombres temporales únicos (consulte man tempfile) si está ejecutando varias instancias en paralelo.

Ian Mackinnon
fuente
Además, agregar --retry-connrefused puede ayudar a prevenir el archivo vacío en primer lugar.
akom
Si esto está sucediendo en un ejecutivo en un manifiesto títere, cambiar crea => archivo a menos que => "[-s archivo]" puede hacer que se recupere por sí mismo.
akom
13

Como está escrito en los comentarios, wget -O es más como una redirección de shell que siempre escribe en el archivo independientemente de los errores.

Puedes usar curl -fen su lugar:

curl -f http://nonexistent/file.jpg -o localfile.jpg

No tocará el archivo local si hay un error al recuperar el archivo.

Cweiske
fuente
4

La sintaxis correcta es

wget "url" -O file

observe la MAYÚSCULA O. Las opciones -o le dicen a wget que escriba un archivo de registro , por eso siempre se escribe incluso en caso de falla.

Señor shunz
fuente
Al principio pensé que estaba funcionando, pero luego descubrí que no. try wget " host.does.not.exist " -O "emptyFile" Se devuelve un error, pero se crea el emptyFile.
akurtser
1
@akurtser tienes razón. Creo que no hay forma de decirle a wget que no cree el archivo. Encontré este hilo: mail-archive.com/[email protected]/msg08586.html en el que discuten el asunto. La base es que puede tener MÚLTIPLES descargas en el mismo archivo para que se cree porque no se puede asegurar que TODAS las URL fallarán.
Sr. Shunz el
Bueno, gracias, es parte de un script bash que estoy escribiendo, así que solo intentaré guardarlo primero en un archivo temporal, que en caso de descarga exitosa, cambiará de nombre. No es muy elegante, pero no se me ocurre nada mejor.
akurtser
1
@akurtser Seguramente puede verificar el código de retorno de wget, entonces ... debería decirle si puede eliminar el archivo "si no se encuentra". Entonces no hay necesidad de temp / renombrar.
Sr. Shunz el
1
La opción -O es una redirección, que redirige el contenido descargado a un archivo, incluso en los casos en que no hay contenido. Por lo tanto, siempre se crea un archivo, incluso si la descarga falla.
Quan al
0

Según el documento de ayuda (wget -h), puede usar la opción --spider para omitir la descarga (versión 1.14).

Download:
  -S,  --server-response         print server response.
       --spider                  don't download anything.

qi rocoso
fuente