curl 使用大括号语法下载多个文件

curl 使用大括号语法下载多个文件

我试图通过以下语法下载两个文件:

curl -O http://domain/path/to/{file1,file2}

问题是只有第一个文件实际上保存在本地,第二个文件只是打印到标准输出。

我确实意识到,如果我添加一个-O它就可以正常工作:

curl -OO http://domain/path/to/{file1,file2}

但如果文件数量变得太大,这不是不切实际吗?例如,

curl -O http://domain/path/to/file[1,100]

我的问题是,是否真的没有办法一次下载多个单独的文件curl(不添加正确数量的-O)?

答案1

--remote-name-all选项告诉curl 的行为就像您对每个文件使用-O或一样。--remote-name所以这个命令就可以解决问题:

curl --remote-name-all http://domain/path/to/{file1,file2}

参考这里

此选项自推出以来一直可用版本 7.19.0

答案2

这已在curl 7.19.0中实现。请参阅@Besworks 的回答。

根据手册页,除了使用多个 s 之外,没有办法保留原始文件名O。或者,您可以使用自己的文件名:

curl http://{one,two}.site.example -o "file_#1.txt"

导致http://one.site.example被保存到file_one.txthttp://two.site.example被保存到file_two.txt

多个变量甚至可以发挥作用。喜欢:

curl http://{site,host}.host[1-5].example -o "#1_#2"

导致http://site.host1.example被保存到site_1http://host.host1.example被保存到host_1等等。

答案3

这里的问题是 shell(可能是 BASH)如何解释命令curl

基本上,它是在看

curl -O http://domain/path/to/{file1,file2}

并将其扩展为:

curl -O http://domain/path/to/file1 http://domain/path/to/file2

这是一个问题,因为标志-O只应用于第一个实例,而不应用于其后的任何实例。

这可以通过双引号 url 来修复:

curl -O "http://domain/path/to/{file1,file2}"

Curl 团队已经承认了这一点GitHub以及手册页和官方卷曲手册已提交,因此它们应该在将来的某些 shell 中反映这种潜在的通配行为。

如果您想要一个简单的测试用例来查看此故障以及如何修复它,请尝试下载两个 .txt 文件的 zip莫比迪克古腾堡计划

跑步:

curl -O https://www.gutenberg.org/files/2701/2701-{0,h}.zip

将提供以下响应:

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 500k 100 500k 0 0 380k 0 0:00:01 0:00:01 --:--:-- 380k Warning: Binary output can mess up your terminal. Use "--output -" to tell Warning: curl to output it to your terminal anyway, or consider "--output Warning: <FILE>" to save to a file.

(如果您提取的文件是原始文本,那么它只会转储到标准输出,可能是您的屏幕,这对于莫比迪克这就是为什么使用 .zip 文件来代替。)

跑步:

curl -O "https://www.gutenberg.org/files/2701/2701-{0,h}.zip"

将给出类似这样的输出:

[1/2]: https://www.gutenberg.org/files/2701/2701-0.zip --> 2701-0.zip --_curl_--https://www.gutenberg.org/files/2701/2701-0.zip % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 500k 100 500k 0 0 407k 0 0:00:01 0:00:01 --:--:-- 407k

[2/2]: https://www.gutenberg.org/files/2701/2701-h.zip --> 2701-h.zip --_curl_--https://www.gutenberg.org/files/2701/2701-h.zip % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 522k 100 522k 0 0 1000k 0 --:--:-- --:--:-- --:--:-- 1000k

请注意,此问题仅在{ }用于通配符时才会出现。如果仅[ ]使用则不需要双引号。

顺便说一句,如果wget安装了,它可能可以处理通配符而无需引号。

跑步:

wget http://domain/path/to/{file1,file2}

将拉下这两个文件(如果它们确实存在)。

跑步:

wget https://www.gutenberg.org/files/2701/2701-{0,h}.zip

将按照上面的双引号curl示例下载 Moby Dick zip 文件。

答案4

还有一种使用curl下载多个文件的替代方法:

urls="firstUrl secondUrl thirdUrl" 
for url in $urls
do
   curl -O "$url"
done

笔记:必填空格,用于分隔不同的 URL。

相关内容