如何使用curl下载文件并保留远程文件名

136
我需要下载成千上万张以特定格式保存的图片。这个问题可能与以下问题重复:
如何使用cURL响应头中的文件名保存文件

http://oregondigital.org/cgi-bin/showfile.exe?CISOROOT=/baseball&CISOPTR=0

如果您将该链接粘贴到浏览器中,它会尝试下载名为1.jp2的文件。
我想使用curl来完成相同的操作。但是,当我运行
curl -I 'http://oregondigital.org/cgi-bin/showfile.exe?CISOROOT=/baseball&CISOPTR=0'
报告的文件名为404.txt,您可以下载并查看它实际上是我想要的文件。我无法使用-O选项,因为分配给文件的名称不好,并且出于技术原因,我需要系统上使用的实际名称。
如何让curl下载与我的浏览器检索相同的文件?谢谢。

我的猜测是这与调用者的用户代理有关,尽管我刚刚尝试了添加Chrome的UA,但并没有帮助。 - Yevgeny Simkin
2个回答

227
解决方案是使用-O -J
-O, --remote-name          Write output to a file named as the remote file  
-J, --remote-header-name   Use the header-provided filename
所以...
curl  -O -J  'http://oregondigital.org/cgi-bin/showfile.exe?CISOROOT=/baseball&CISOPTR=0'

我必须升级我的CURL。 我有v7.19,不支持-J选项,但是v7.22(最新版)支持该选项。


22
您可以写成“-OJ”。或者如果与其他选项组合,例如“-LOJR”。 - smci
1
根据7.20.0 § curl - Changes的说明,在7.20.0版本中添加了-J--remote-header-name选项。 - li ki
5
只需使用 --remote-name 参数即可。 - Alex
但请记住,如果服务器在“Content-Disposition”中使用UTF-8,则可能无法正常工作。因为某些cURL版本无法正确处理它。至少macOS的curl 7.84.0不行。 - Rostyslav Druzhchenko
在这种情况下,您可以使用wget作为替代方法。wget --content-disposition <URL> - Rostyslav Druzhchenko

-8

你可以使用 -o 选项,是吗?例如:

 curl  'http://oregondigital.org/cgi-bin/showfile.exe?CISOROOT=/baseball&CISOPTR=[0-9]' -o "#1.jpg"

1
他在问题中明确表示,他不能使用-O,因为他不想显示文件名为showfile.exe等。请注意! :) - Yevgeny Simkin
用户在这种情况下无法定义文件名...它来自传入响应的头部。 - Yevgeny Simkin
7
-o 可以让你设置自定义的文件名和更重要的是,自定义下载文件的位置。-O 会自动命名文件,但也会将其下载到默认位置(在我的情况下是我的主文件夹)。那么我如何同时使用这两个选项,选择文件下载的位置,但保留来自服务器的文件名呢? - l008com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接