我在此语法中使用curl:
curl -o myfile.jpg http://example.com/myfile.jpg
如果我运行此命令两次,我会得到两个文件:
myfile.jpg
myfile-1.jpg
我如何告诉 Curl 我希望它覆盖该文件(如果存在)?
答案1
-o
不要使用选项写入文件,而是使用 shell 将输出定向到文件:
curl http://example.com/myfile.jpg > myfile.jpg
答案2
经过--clobber
。这还涵盖使用-J
.
答案3
我遇到了同样的问题,我想重用相同的文件名,无论服务器端返回什么。在您的情况下,您可以通过以下方式获取文件名basename
:
➸ basename 'http://example.com/myfile.jpg'
myfile.jpg
然后你可以编写一个 Bash 辅助函数,例如:
➸ function download { name="$(basename $1)"; curl "$1" > "$name"; }
➸ download 'http://example.com/myfile.jpg'
然而,就我而言,文件名甚至不是 URL 的一部分;它带有Content-Disposition
标题。使用 Curl 的命令行是:
➸ curl -fSL -R -J -O 'http://example.com/getData.php?arg=1&arg2=...'
如果你愿意,你可以忽略-fSL
-- 它会处理服务器端返回的情况302 Redirection
。这里的相关标志是:
-R
用于服务器端时间戳-J
考虑服务器端Content-Disposition
-O
切换到下载行为而不是在终端上转储
但是,如果文件名存在,它仍然会拒绝覆盖。如果服务器端Last-Modified
时间戳较新,我希望它被覆盖。
所以我最终得到了一个能够做到这一点的 wget 解决方案:
➸ wget -NS --content-disposition 'http://example.com/getData.php?arg=1&arg2=...'
-N
是检查服务器端时间戳并仅当服务器端有新版本时覆盖--content-disposition
是要考虑Content-Disposition
标题- wget 的默认行为是下载到服务器端给出的文件名。
在你的情况下,如果你不关心时间戳,它只是:
➸ wget -O myfile.jpg http://example.com/myfile.jpg