仅当自上次更新以来发生更改时才通过 http 下载文件

cwe*_*ske 27 linux download http

我需要从 HTTP 服务器下载文件,但前提是它自上次下载以来发生了变化(例如,通过If-Modified-Since标头)。我还需要为磁盘上的文件使用自定义名称。

我可以在 linux 上使用什么工具来完成这项任务?


wget -N不能使用,因为-N不能与 一起使用-O

Tob*_*ght 34

考虑使用curl代替wget

curl -o "$file" -z "$file" "$uri"
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

(请注意,我们没有引用$zflag此处的扩展,因为我们希望它分裂为 0 或 2 个标记)。

如果您的 shell 支持数组(例如 Bash),那么我们有一个更安全、更干净的版本:

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

  • 在curl 7.64.0中,如果-z文件尚不存在,curl只会输出警告,然后成功下载该文件并退出。 tl;dr,如果您可以忽略警告,则不需要 zflag 检查。 (4认同)

Jul*_*ght 9

wget 开关-N仅在文件发生更改时获取文件,因此一种可能的方法是使用简单的-N开关,该开关将在需要时获取文件,但会保留错误的名称。然后使用ln -P命令创建硬链接以将其链接到具有正确名称的“文件”。链接文件与原始文件具有相同的元数据。

唯一的限制是您不能跨文件系统边界建立硬链接。

  • wget 是这项工作的更好工具。它会检查时间戳和文件大小,而 curl (7.38.0) 不会。此外,wget 在 4xx/5xx 上以非 0 终止,而 curl 在默认情况下并不真正关心服务器代码。 (3认同)

sir*_*rex 5

用于包装 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 (),
))
Run Code Online (Sandbox Code Playgroud)