faz o download do arquivo via http somente se for alterado desde a última atualização

11

Eu preciso baixar um arquivo de um servidor HTTP, mas somente se ele mudou desde a última vez que fiz o download (por exemplo, através do If-Modified-Since header). Eu também preciso usar um nome personalizado para o arquivo no meu disco.

Qual ferramenta posso usar para esta tarefa no linux?

wget -N não pode ser usado porque -N não pode ser usado com -O .

    
por cweiske 30.04.2015 / 21:55

3 respostas

13

Considere usar curl em vez de wget :

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

man curl diz:

-z/--time-cond <date expression>

(HTTP/FTP) Request a file that has been modified later than the given time and date, or one that has been modified before that time. The date expression can be all sorts of date strings or if it doesn't match any internal ones, it tries to get the time from a given file name instead.

Se $file não necessariamente existir, você precisará usar o -z flag condicional, usando test -e "$file" :

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

(Observe que não citamos a expansão de $zflag aqui, pois queremos que ele seja dividido em 0 ou 2 tokens).

    
por 01.05.2015 / 14:16
6

A opção wget -N só obtém o arquivo se ele foi alterado, portanto, uma possível abordagem seria usar a opção simples -N , que obterá o arquivo se necessário, mas o deixará com o nome incorreto. Em seguida, crie um link físico usando o comando ln -P para vinculá-lo a um "arquivo" com o nome correto. O arquivo vinculado tem os mesmos metadados do original.

A única limitação é que você não pode ter hard links através dos limites do sistema de arquivos.

    
por 01.05.2015 / 10:11
3

Script do Python 3.5+ para configurar o 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 (),
))
    
por 23.12.2016 / 09:51