我想要
curl
下载链接,但我希望它跳过已经存在的文件。现在,我的这行代码无论如何都会继续覆盖它:
curl '$url' -o /home/$outputfile &>/dev/null &
如何实现这一点?
您可以使用卷曲选项
-C -
。此选项用于恢复中断的下载,但如果文件已完成,则将跳过下载。请注意,-C
的参数是一个破折号。一个缺点可能是,curl 仍会短暂联系远程服务器以询问文件大小。
您可以将对
curl
的呼叫放在 if
块内:
if ! [ -f /home/$outputfile ]; then
curl -o /home/$outputfile "url"
fi
另请注意,在您的示例中,单引号内有
$url
,这不会执行您想要的操作。 比较:
echo '$HOME'
致:
echo "$HOME"
此外,
curl
有一个 --silent
选项,在脚本中很有用。
使用 wget 和
--no-clobber
代替:
、-nc
:跳过将下载到现有文件的下载。--no-clobber
示例:
wget -nc -q -O "/home/$outputfile" "$url"
curl
和
-O
一起使用时,
-J
可能支持跳过文件,但其行为不一致。
-J
(
--remote-header-name
) 基本上告诉
-O
(
--remote-name
) 选项使用服务器指定的
Content-Disposition
文件名,而不是从 URL 中提取文件名。这样,
curl
并不真正知道服务器将返回什么文件名,因此为了安全起见,它可能会忽略现有文件。例如:
$ curl -LJO -H 'Accept: application/octet-stream' 'https://api.github.com/repos/x/y/releases/assets/12345
Warning: Refusing to overwrite my_file.bin: File
Warning: exists
curl: (23) Failed writing body (0 != 16384)
但是正如已经提到的,它的行为是不可预测的,并且它并不适用于所有文件。