descargar el archivo a través de http solo si se ha cambiado desde la última actualización


12

Necesito descargar un archivo desde un servidor HTTP, pero solo si ha cambiado desde la última vez que lo descargué (por ejemplo, a través de If-Modified-Since encabezamiento). También necesito usar un nombre personalizado para el archivo en mi disco.

¿Qué herramienta puedo usar para esta tarea en linux?


wget -N no se puede usar porque -N no se puede utilizar con -O.


¿Por qué no descargar el archivo y entonces renombrarlo?
Julian Knight

.. porque la herramienta aún necesita poder verificar si el recurso HTTP cambió desde la última descarga? Esto será difícil si se ha cambiado el nombre del archivo y, por lo tanto, ya no existe en el lugar donde la herramienta lo espera.
cweiske

Lo siento, me apresuré en ese comentario, ver mi respuesta.
Julian Knight

Respuestas:


14

Considere usar curl en lugar de wget:

curl -o "$file" -z "$file" "$uri"

man curl dice:

-z / --time-cond & lt; expresión de fecha & gt;

(HTTP / FTP) Solicite un archivo que se haya modificado después de la fecha y la hora especificadas, o una            Eso ha sido modificado antes de ese tiempo. La expresión de fecha puede ser todo tipo de fecha.            cadenas o si no coincide con ninguna interna, en su lugar intenta obtener el tiempo de un nombre de archivo dado.

Si $file no necesariamente preexistente, deberá hacer uso del -z bandera condicional, utilizando test -e "$file":

if test -e "$file"
then zflag="-z '$file'"
else zflag=
fi
curl -o "$file" $zflag "$uri"

(Tenga en cuenta que no citamos la expansión de $zflag aquí, como queremos que se someta a división en 0 o 2 tokens).


6

El interruptor wget -N solo obtiene el archivo si ha cambiado, por lo que un posible enfoque sería utilizar el sencillo -N interruptor que obtendrá el archivo si es necesario, pero lo deja con el nombre incorrecto. Luego crea un enlace duro usando el ln -P comando para vincularlo a un "archivo" con el nombre correcto. El archivo vinculado tiene los mismos metadatos que el original.

La única limitación es que no puede tener enlaces duros entre los límites del sistema de archivos.


Para muchos propósitos, un enlace simbólico puede ser adecuado, a menos que la identidad del inodo realmente sea importante para el solicitante.
Toby Speight

1
Wget es la mejor herramienta para este trabajo. Verifica la marca de tiempo Y el tamaño del archivo, lo que no hace curl (7.38.0). Además, wget termina con un no-0 en 4xx / 5xx, mientras que a curl no le importan los códigos de servidor de forma predeterminada.
schieferstapel

3

Python 3.5+ script para envolver el comando curl:

import argparse
import pathlib

from subprocess import run
from itertools import chain

parser = argparse.ArgumentParser()
parser.add_argument('url')
parser.add_argument('filename', type=pathlib.Path)
args = parser.parse_args()

run(chain(
    ('curl', '-s', args.url),
    ('-o', str(args.filename)),
    ('-z', str(args.filename)) if args.filename.exists() else (),
))

¡Esto es increíble! TIL chain :)
John Oxley
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.