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