检查curl incremental(--continue-at)下载是否成功

时间:2016-06-17 15:40:55

标签: bash curl

我使用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

如何实现这一目标?

1 个答案:

答案 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以获取有关提取元数据的详细讨论。