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?

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.


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.


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.


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/wget@sunsite.dk/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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.