Answers:
考虑使用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"
wget开关-N
仅在文件已更改的情况下才获取文件,因此一种可行的方法是使用简单的-N
开关,该开关将在需要时获取文件,但使用错误的名称保留文件。然后使用ln -P
命令创建一个硬链接,将其链接到具有正确名称的“文件”。链接的文件具有与原始文件相同的元数据。
唯一的限制是您不能跨文件系统边界具有硬链接。
用于包装curl命令的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 (),
))
chain
:)
与“ 日期检查 ”(带有“ curl --time-cond”)类似的方法是根据文件大小比较进行下载,即仅在本地文件的大小与远程文件的大小不同时下载。
例如,当下载过程在中间失败时很有用,因此本地下载文件的日期比远程文件的日期新,但实际上它已损坏,因此需要重新下载:
local_file_size=$([[ -f ${FILE_NAME} ]] && wc -c < ${FILE_NAME} || echo "0")
remote_file_size=$(curl -sI ${FILE_URL} | awk '/Content-Length/ { print $2 }' | tr -d '\r' )
if [[ "$local_file_size" -ne "$remote_file_size" ]]; then
curl -o ${FILE_NAME} ${FILE_URL}
fi
在这种情况下,“ curl -z / --time-cond”选项(在另一个答案中建议)将不会下载远程文件(因为本地文件的日期更新),但是此“ size check ”脚本会下载!