12

Мне нужно загрузить файл с HTTP-сервера, но только если он изменился с момента последней загрузки (например, через заголовок If-Modified-Since ). Мне также нужно использовать произвольное имя для файла на моем диске.

Какой инструмент я могу использовать для этой задачи в Linux?


wget -N нельзя использовать, потому что -N нельзя использовать с -O .

3 ответа3

14

Попробуйте использовать curl вместо wget:

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

man curl говорит:

-z/--time-cond <выражение даты>

(HTTP/FTP) Запросить файл, который был изменен позднее, чем указанное время и дата, или файл, который был изменен до этого времени. Выражение даты может быть всевозможными строками даты или, если оно не совпадает ни с какими внутренними, вместо этого оно пытается получить время из заданного имени файла.

Если $file не обязательно существует заранее, вам нужно использовать условный флаг -z , используя test -e "$file":

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

(Обратите внимание, что мы не указываем здесь расширение $zflag , поскольку хотим, чтобы он подвергался расщеплению до 0 или 2 токенов).

6

Ключ wget -N получает файл только в том случае, если он изменился, поэтому возможный подход заключается в использовании простого ключа -N который при необходимости получает файл, но оставляет его с неверным именем. Затем создайте жесткую ссылку с помощью команды ln -P чтобы связать ее с "файлом" с правильным именем. Связанный файл имеет те же метаданные, что и оригинал.

Единственным ограничением является то, что вы не можете иметь жесткие ссылки через границы файловой системы.

3

Скрипт Python 3.5+ для переноса команды 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 (),
))

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .