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

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

我在此语法中使用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

相关内容