29

我想curl下载一个链接,但我希望它跳过已经存在的文件。现在,无论如何,我拥有的代码行将继续覆盖它:

curl '$url' -o /home/$outputfile &>/dev/null &

如何做到这一点?

4

4 回答 4

28

你可以把你的电话curl放在一个if块内:

if ! [ -f /home/$outputfile ]; then
  curl -o /home/$outputfile "url"
fi

另请注意,在您的示例中,您有$url单引号,这不会做您想要的。相比:

echo '$HOME'

至:

echo "$HOME"

此外,curl还有一个--silent在脚本中很有用的选项。

于 2012-08-08T01:25:43.267 回答
27

您可以使用 curl 选项-C -。此选项用于恢复中断的下载,但如果文件已经完成,则会跳过下载。请注意,参数 to-C是一个破折号。一个缺点可能是 curl 仍然会短暂地联系远程服务器以询问文件大小。

于 2017-11-10T16:14:51.060 回答
16

使用 wget--no-clobber代替:

-nc, --no-clobber: 跳过将下载到现有文件的下载。

例子:

wget -nc -q -O "/home/$outputfile" "$url" 
于 2012-08-08T01:15:48.877 回答
2

与和一起使用curl时可能支持跳过文件,但其行为不一致。-O-J

( ) 基本上告诉-J( )选项使用服务器指定的文件名,而不是从 URL 中提取文件名。这样一来,服务器并不真正知道服务器将返回什么文件名,因此它可能会忽略现有文件以进行安全预防。--remote-header-name-O--remote-nameContent-Dispositioncurl

资料来源:回复:-J“拒绝覆盖……”

例如:

$ 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)

然而,正如已经提到的,它的行为是不可预测的,并且不适用于所有文件。

于 2016-06-17T02:02:18.433 回答