我使用bash脚本
curl "$url" -o ~/Downloads/"$savePath"/"$filename" -L -C -
下载支持恢复中断下载的文件(这是-C -
所做的)。但是,我不知道如何检查下载是否成功并导致完整的文件。我尝试使用--fail
(-f
)获取与成功或失败相对应的退出状态,如下所示:
curl -f "$url" -o ~/Downloads/"$savePath"/"$filename" -L -C -
但是,如果下载完成,则会退出非零退出状态并出现以下错误:
curl: (22) The requested URL returned error: 416
如何实现这一目标?
答案 0 :(得分:1)
当您的文件已经完成时,带有-C -
的HTTP 416("请求范围不可满足")是一个合理的响应:文件当前大小之后的内容范围是空的设置,所以当服务器 可以返回一个0字节的成功响应时,它也可以说明没有可能的响应,这就是你在这里看到的。
如果您的服务支持Content-Length标头,您可以采取的一种方法是从HEAD请求中提取预期的文件大小,并将其与磁盘上的当前大小进行比较:
dest="$HOME/Downloads/$savePath/$filename"
if [[ -e $dest ]]; then
remote_size=$(curl -I "$url" | awk -F: '/^Content-Length:/ { print $2 }')
local_size=$(stat --format=%s "$dest")
if ! [[ $remote_size ]]; then
echo "Unable to retrieve remote size: Server does not provide Content-Length" >&2
elif ! [[ $local_size ]]; then
echo "Unable to check local size: Validate that GNU stat is installed" >&2
elif (( remote_size == local_size )); then
echo "File is complete" >&2
elif (( remote_size > local_size )); then
echo "Download is incomplete -- can probably resume" >&2
elif (( remote_size < local_size )); then
echo "Remote file shrunk -- probably should delete local and start over" >&2
fi
else
echo "File does not exist locally at all" >&2
fi
请注意stat --format
是GNU扩展。如果您在MacOS上运行,则可以通过MacPorts将GNU stat安装为gstat
;如果您没有GNU工具,请参阅BashFAQ #87以获取有关提取元数据的详细讨论。