마지막 업데이트 이후 변경된 경우에만 http를 통해 파일 다운로드

마지막 업데이트 이후 변경된 경우에만 http를 통해 파일 다운로드

HTTP 서버에서 파일을 다운로드해야 하는데, 마지막으로 다운로드한 이후 변경된 경우에만 가능합니다(예: 헤더를 통해 If-Modified-Since). 또한 내 디스크에 있는 파일에 대해 사용자 정의 이름을 사용해야 합니다.

Linux에서 이 작업을 위해 어떤 도구를 사용할 수 있나요?


wget -N-N와 함께 사용할 수 없으므로 사용할 수 없습니다 -O.

답변1

curl다음 대신 사용을 고려하십시오 wget.

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

man curl말한다:

-z/--time-cond <날짜 표현>

(HTTP/FTP) 지정된 시간과 날짜 이후에 수정된 파일, 또는 그 이전에 수정된 파일을 요청합니다. 날짜 표현식은 모든 종류의 날짜 문자열일 수 있으며 내부 문자열과 일치하지 않는 경우 대신 주어진 파일 이름에서 시간을 가져오려고 시도합니다.

반드시 사전에 존재하지 않는 경우 다음을 사용하여 플래그를 조건부로 $file사용해야 합니다 .-ztest -e "$file"

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

$zflag( 우리는 0 또는 2개의 토큰으로 분할하기를 원하기 때문에 여기서 확장을 인용하지 않습니다 .)

쉘이 배열(예: Bash)을 지원하는 경우 더 안전하고 깔끔한 버전이 있습니다.

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

답변2

wget 스위치는 -N파일이 변경된 경우에만 파일을 가져오므로 가능한 접근 방식은 -N필요한 경우 파일을 가져오지만 잘못된 이름으로 남겨두는 간단한 스위치를 사용하는 것입니다. 그런 다음 명령을 사용하여 하드 링크를 만들어 ln -P올바른 이름의 "파일"에 연결합니다. 링크된 파일에는 원본과 동일한 메타데이터가 있습니다.

유일한 제한은 파일 시스템 경계를 넘어 하드 링크를 가질 수 없다는 것입니다.

답변3

컬 명령을 래핑하기 위한 Python 3.5+ 스크립트:

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 (),
))

답변4

나는 wget으로 다양한 것을 시도했지만 " -N "을 사용하지 않는 한 출력을 자르는 것을 막을 수 없었습니다.

대신, 자신만의 -if-modified 헤더를 요리하고 잘린 파일을 백업으로 바꿀 수 있습니다.

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

관련 정보