使用curl下载时如何跳过已经存在的文件?

问题描述 投票:0回答:6

我想要

curl
下载链接,但我希望它跳过已经存在的文件。现在,我的这行代码无论如何都会继续覆盖它:

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

如何实现这一点?

curl command-line download
6个回答
49
投票

您可以使用卷曲选项

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


33
投票

您可以将对

curl
的呼叫放在
if
块内:

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

另请注意,在您的示例中,单引号内有

$url
,这不会执行您想要的操作。 比较:

echo '$HOME'

致:

echo "$HOME"

此外,

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


20
投票

使用 wget 和

--no-clobber
代替:

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

示例:

wget -nc -q -O "/home/$outputfile" "$url" 

4
投票

从 2022 年 4 月 27 日发布的 7.83 版本开始,curl

 现在有一个 
--no-clobber
 选项,就像 
wget
 一样,它几乎可以满足您的需求。


3
投票
当您与

curl

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

-J

 (
--remote-header-name
) 基本上告诉 
-O
 (
--remote-name
) 选项使用服务器指定的 
Content-Disposition
 文件名,而不是从 URL 中提取文件名。这样,
curl
并不真正知道服务器将返回什么文件名,因此为了安全起见,它可能会忽略现有文件。

来源:回复:-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)

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


0
投票
curl 8.10.0 - 于 2024 年 9 月 11 日发布,现在有一个

--skip-existing

 标志。

curl -LJO --skip-existing <your_link>

https://curl.se/ch/8.10.0.html

© www.soinside.com 2019 - 2024. All rights reserved.