我正在尝试使用 cURL 下载一系列播客剧集。我知道如何使用一系列数字来下载与某个模式匹配的多个文件,但我不知道如何在单个 URL 中拥有多个范围。
示例 URL:
http://www.example.com/01_episode_1.mp3
http://www.example.com/02_episode_2.mp3
http://www.example.com/03_episode_3.mp3
...
http://www.example.com/52_episode_52.mp3
如果我使用
curl -O http://www.example.com/[01-52]_episode_[1-52].mp3
我得到这样的文件:
01_episode_1.mp3
01_episode_2.mp3
01_episode_3.mp3
...
01_episode_52.mp3
02_episode_1.mp3
02_episode_2.mp3
02_episode_3.mp3
...
02_episode_52.mp3
03_episode_1.mp3
03_episode_2.mp3
03_episode_3.mp3
...
03_episode_52.mp3
etc...
但其中大多数显然不是有效文件。
如何使用cURL抓取我想要的文件?或者也许我尝试使用错误的工具来完成这项工作?
这是在 OS X 10.10.3 上,并且该平台上默认安装了任何版本的 cURL。
答案1
虽然对于这种特殊情况的解决方案较弱,但它在类似问题中相当有用:curl
功能范围通配。我偶然发现了这个线程,所以其他人也可能。
curl http://www.example.com/[01-52]_episode_[1-52].mp3 -o "ep#1_#2.mp3"
find . type -f -empty -delete
解释的话:
- 使用 的
curl
范围通配功能 - 这里比循环弱,因为有两个几乎相同实际上意味着相同的范围(除了第一个 - 中的前导零)。
- 选择
-o
支持-O
使用本地名称并显示#1 #2 ... #n
在使用范围通配符时保存文件的功能curl
。 - 您可以只选择第二个数字,
-o "#2.mp3"
但这会覆盖文件! DLing01ep1.mp3
并02ep1.mp3
保存1.mp3
- 在 example.com 上进行测试将产生奇怪的结果,因为该页面总是回复 200 且相同的页面,正如您所知,这就是 IANA 的设置方式。
- 功能文档:https://ec.haxx.se/cmdline-globbing.html
find
呼叫在这里,因为我不知道最大范围- 这将保存所有文件:如果范围是[1-10]并且只有第1页和第2页,它将保存第3-9页(包括第3页和第2页)的空文件。因此:
find . -empty -delete
它删除空文件。显然,由于上述问题example.com网站这在那里不起作用。
答案2
怎么样:
for i in {1..52}; do curl -O `printf "http://www.example.com/%02d_episode_%d.mp3" $i $i`; done