
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
사용해야 합니다 .-z
test -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