descargue el archivo a través de http solo si se modificó desde la última actualización

descargue el archivo a través de http solo si se modificó desde la última actualización

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

¿Qué herramienta puedo utilizar para esta tarea en Linux?


wget -NNo se puede utilizar porque -Nno se puede utilizar con -O.

Respuesta1

Considere usar curlen lugar de wget:

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

man curldice:

-z/--time-cond <expresión de fecha>

(HTTP/FTP) Solicite un archivo que haya sido modificado después de la hora y fecha indicadas, o uno que haya sido modificado antes de esa hora. La expresión de fecha puede ser todo tipo de cadenas de fecha o, si no coincide con ninguna interna, intenta obtener la hora de un nombre de archivo determinado.

Si $fileno necesariamente existe previamente, deberá hacer que el uso de la -zbandera sea condicional, usando 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 $zflagaquí, ya que queremos que se divida en 0 o 2 tokens).

Si su shell admite matrices (por ejemplo, Bash), entonces tenemos una versión más segura y limpia:

if test -e "$file"
then zflag=(-z "$file")
else zflag=()
fi
curl -o "$file" "${zflag[@]}" "$uri"

Respuesta2

El modificador wget -Nsolo obtiene el archivo si ha cambiado, por lo que un posible enfoque sería utilizar el -Nmodificador simple que obtendrá el archivo si es necesario pero lo dejará con el nombre incorrecto. Luego cree un vínculo físico usando el ln -Pcomando 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 se pueden tener enlaces duros a través de los límites del sistema de archivos.

Respuesta3

Script Python 3.5+ 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 (),
))

Respuesta4

Probé varias cosas con wget y no pude evitar que truncara la salida a menos que usara " -N ".

En su lugar, puede crear su propio encabezado -si se modifica y reemplazar archivos truncados con copias de seguridad.

OUTFILE="some.thing"
IF_MOD_DATE=`date "+%a, %d %b %Y %T %Z" -r $OUTFILE`
IF_MOD_HEADER="If-Modified-Since: $IF_MOD_DATE"

cp $OUTFILE backup_$OUTFILE
wget -O $OUTFILE --header="$IF_MOD_HEADER" "http://your.tld/resource"

# if files is truncated, replace with backup
[ -s $OUTFILE ] || { rm $OUTFILE && mv backup_$OUTFILE $OUTFILE ; }

# remove any backup and ignore complaints of missing files.
rm backup_$OUTFILE 2>&1

información relacionada