如何指定curl(通过命令行)覆盖文件(如果已存在)?


11

我在这种语法中使用curl:

curl -o myfile.jpg http://mysite.com/myfile.jpg

如果我两次运行此命令,则会得到两个文件:

myfile.jpg
myfile-1.jpg

如何告诉CURL我希望它覆盖文件(如果存在)?


5
无法重现:curl哪个系统上的哪个版本?
enzotib

Answers:


21

采用:

curl http://mysite.com/myfile.jpg > myfile.jpg

2
而且,请确保没有noclobber启用该选项(set +o noclobber)。
rozcietrzewiacz 2011年

0

我遇到了同样的问题,无论服务器端提供什么,我都想重用相同的文件名,在这种情况下,您可能会通过 basename

➸ basename 'http://mysite.com/myfile.jpg'
myfile.jpg

那么您可以编写一个类似于以下内容的助手bash函数:

➸ function download { name="$(basename $1)"; curl "$1" > "$name"; }
➸ download 'http://mysite.com/myfile.jpg'

但就我而言,文件名甚至不是URL的一部分,它带有content-disposition;与curl命令行是

$ curl -fSL -R -J -O 'http://some-site.com/getData.php?arg=1&arg2=...'

-fSL如果服务器端提供302重定向,则可以忽略它处理的内容;在-R用于服务器端时间戳,-J考虑服务器端Content-Disposition,并-O切换到下载行为而不是在终端倾倒;

但是,如果文件名存在,它仍然会拒绝覆盖;如果服务器端Last-Modified时间戳较新,我希望它覆盖;

最终有了一个wget解决方案,它可以做到:

$ wget -NS --content-disposition 'http://some-site.com/getData.php?arg=1&arg2=...'

-N是检查服务器端tiemstamp和覆盖,只有当服务器端有新的版本; --content-disposition是要考虑Content-Disposition标题;wget的默认行为是下载到服务器端给定的文件名。

就您而言,如果您不关心时间戳,那只是

$ wget -O myfile.jpg http://mysite.com/myfile.jpg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.