¿Puedo detener wget creando duplicados?

13

Si ejecuto wget dos veces, no reconoce que ya ha descargado ese archivo y crea uno nuevo. ¿Hay alguna manera de evitar que descargue el archivo nuevamente?

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png.1’
...

(Feliz de usar curl o una alternativa similar con secuencia de comandos si wget no puede hacer esto).

david.libremone
fuente
99
Bueno, crea uno nuevo porque reconoce que el archivo está allí.
nico

Respuestas:

17

Te sugiero que uses la -Nopción.

-N
--timestamping
    Turn on time-stamping.

Permite la marca de tiempo, que vuelve a descargar el archivo solo si es más reciente en el servidor que la versión descargada.

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Server file no newer than local file ‘logo.png’ -- not retrieving.

Advertencia (del comentario de KasiyA)

Si el servidor no está configurado correctamente, siempre puede informar que el archivo es nuevo y -Nsiempre lo volverá a descargar. En este caso, -nces probablemente una mejor opción.

jofel
fuente
3
Cuando un servidor no está configurado correctamente -Npuede fallar y wget siempre se volverá a descargar. Así que a veces -nces mejor que-N
αғsнιη
1
@ Kasiy gracias por tu comentario, parece que no hay una buena opción para todos los casos.
jofel
16

Sí, es una -copción.

--continue
    Continue getting a partially-downloaded file.  This is useful when you want to
    finish up a download started by a previous instance of Wget, or by another
    program.

Si el archivo es el mismo, se detendrá el segundo intento de descarga.

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
The file is already fully retrieved; nothing to do.

Advertencias (de los comentarios de jofel)

Si el archivo ha cambiado en el servidor, la -copción puede dar resultados incorrectos.

Con -c, wget simplemente le pide al servidor cualquier información más allá de la parte del archivo ya descargado, nada más. No comprueba si hubo algún cambio en la parte del archivo que ya se descargó. Por lo tanto, podría encontrar un archivo dañado que es una mezcla del archivo antiguo y el nuevo.


Prueba local

Puede probarlo ejecutando un servidor web local simple de la siguiente manera (Gracias a la respuesta de @roadmr ):

Abra una ventana de Terminal y escriba:

cd /path/to/parent-download-dir/
python -m SimpleHTTPServer

Ahora abra otra Terminal y haga:

wget -c http://localhost:8000/filename-to-download

Tenga en cuenta que filename-to-downloades el archivo que se encuentra en el /path/to/parent-download-dir/que queremos descargarlo.

Ahora, si ejecuta el comando wget varias veces, verá:

The file is already fully retrieved; nothing to do.

Ok, ahora vaya al /path/to/parent-download-dir/directorio y agregue algo al archivo fuente, por ejemplo, si es un archivo de texto, agregue una línea adicional simple y guarde el archivo. Ahora intenta con wget -c .... Genial, ahora verá que el archivo se vuelve a descargar nuevamente, pero ya lo ha descargado antes.

Motivo: ¿por qué volver a descargar?

porque su tamaño cambió a un tamaño mayor que el antiguo archivo descargado y nada más.

αғsнιη
fuente
1
Esto no funciona correctamente si el archivo ha cambiado en el servidor entre las descargas. En el peor de los casos (el tamaño del archivo ha aumentado), obtiene un archivo dañado.
jofel
1
@jofel sí, -ncno es como dijiste, pero la -copción funcionará y es por eso que mencioné la -copción primero.
αғsнιη
Con -c, wgetsolicita al servidor cualquier dato más allá de la parte del archivo ya descargado, nada más. No comprueba si, mientras tanto, hay algún cambio en la parte ya descargada del archivo en el servidor. En el peor de los casos, obtienes un archivo dañado que es una mezcla entre el archivo antiguo y el nuevo.
jofel
después de revisar las opciones, creo que esto solo es útil para algo como un archivo de registro (actualizaciones incrementales garantizadas), en todos los demás casos creo que -N o -nc son más apropiados ya que tratan con archivos completos
david.libremone
3

También hay otra opción llamada -ncpara wgetting:

--no-clobber
   If a file is downloaded more than once in the same directory, Wget's behavior
   depends on a few options, including -nc.  In certain cases, the local file will
   be clobbered, or overwritten, upon repeated download.  In other cases it will be
   preserved.

Cuando -ncse especifica la opción, Wget se negará a descargar copias del mismo archivo. Si tenía el mismo archivo que wgetintenta descargar, se negará a descargarlo a menos que cambie el nombre o elimine el archivo local.

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
File ‘logo.png’ already there; not retrieving.

A veces, esta opción es muy buena y recomendé usar la -ncopción en lugar de ambas -cu -Nopción porque estas opciones sobrescribirán el archivo de descarga con su archivo local si tenían los mismos nombres.

Advertencia (del comentario de jofel)

La -ncopción no actualiza el archivo si ha cambiado en el servidor. Si sabe que el archivo cambiará, la -Nopción es preferible. Si sabe que el archivo no cambiará (o no le importa), entonces -ncestá bien.

αғsнιη
fuente
1

Sé que se trataba de una pregunta específica sobre wget, pero el OP mencionó "Me alegra usar curl o una alternativa similar con secuencia de comandos si wget no puede hacer esto". No estoy seguro de cuál es el requisito aquí (varios archivos, mantenga la versión anterior si es diferente de la original, reemplácela con la versión recién descargada). Dependiendo de lo que desee y de cómo desee manejar los duplicados, es posible que necesite más que esto. Una forma muy simple de hacer lo que parece querer es simplemente usar curl.

curl http://cdn.sstatic.net/askubuntu/img/logo.png?v=ca4d192163aa > logo.png

Este comando reemplazará el archivo antiguo con el recién descargado cada vez.

No envíe esto al terminal (sin el "> [nombre de archivo]") si está descargando un archivo binario en lugar de texto. Si lo hace, podría potencialmente meterse con su sesión de terminal. En el caso de que lo haga por accidente, es posible que deba abrir otra sesión de shell / terminal.

Duendecillo
fuente
Si su terminal está en mal estado porque mostró archivos binarios, tal vez sea más fácil llamar al programa "reset" que abrir un nuevo terminal.
jofel
tienes razón en que no tenía claros mis requisitos, el resultado feliz es que aprendí algunas opciones más :) gracias
david.libremone
Gracias @jofel ^^ no sabía sobre "restablecer". Siempre cerré, abrí una nueva pestaña y cerré la ilegible cuando esto sucedió ... aunque realmente no he tenido que suceder a menudo.
Goblinlord