使用curl下载时如何跳过现有文件?

使用curl下载时如何跳过现有文件?,curl,command-line,download,Curl,Command Line,Download,我想curl下载一个链接,但我想让它跳过已经存在的文件。现在,无论发生什么情况,我的代码行都将继续覆盖它: curl '$url' -o /home/$outputfile &>/dev/null & 如何实现这一点?使用wget和——无障碍物: -nc,-无重击:跳过将下载到现有文件的下载 例如: wget -nc -q -O "/home/$outputfile" "$url" 您可以将对curl的调用放入if块中: if ! [ -f /home/$output

我想
curl
下载一个链接,但我想让它跳过已经存在的文件。现在,无论发生什么情况,我的代码行都将继续覆盖它:

curl '$url' -o /home/$outputfile &>/dev/null &
如何实现这一点?

使用wget和
——无障碍物

-nc
-无重击
:跳过将下载到现有文件的下载

例如:

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

您可以将对
curl
的调用放入
if
块中:

if ! [ -f /home/$outputfile ]; then
  curl -o /home/$outputfile "url"
fi
还要注意的是,在您的示例中,单引号中包含了
$url
,这并不能满足您的需要。比较:

echo '$HOME'
致:


另外,
curl
有一个
--silent
选项,可以在脚本中使用。

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

-J
--remote header name
)基本上告诉
-O
--remote name
)选项使用服务器指定的
内容配置
文件名,而不是从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)

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

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

您能指导我如何使用wget吗?最初我使用的是wget,但后来我改为curl,因为我希望新下载的文件具有下载时的时间戳。使用wget,它不会生成新的时间戳,而是生成来自它复制的源的任何时间戳。如何让wget生成新的时间戳?
-N
关闭wget中的时间戳,-nc选项将不会下载较新的文件。改用
-N
,如果有更新的版本,它将下载并覆盖该文件。非常有用,感谢您指出这一点。但我是通过php实现的,我如何通过php运行if语句呢?我对php一无所知,但我确信它有一个相对简单的机制来查看文件是否存在。如果服务器不支持恢复,则无法下载文件(文件不存在)。错误:curl:(33)HTTP服务器似乎不支持字节范围。无法恢复。
$ 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)