我的目标:
- 我想要下载页面上的所有 *.zip 文件,其中所有相关链接都是由服务器脚本完成的重定向(
*/download.php?standard=yes&file=*.zip
)。 - 我希望使用原始链接来命名文件,因为在这种情况下服务器给出的名称始终是“download.zip”。
具体来说,我想从这里下载 OsmAnd 地图:http://download.osmand.net/rawindexes/
我该怎么做?
我尝试过的:
我可以使用wget
MAPS.ME 的地图做类似的事情:
wget -rl1 --accept="mwm" http://direct.mapswithme.com/direct/latest/
但在这种情况下,链接是直接的,并且文件名没有问题。
我也尝试过使用curl -L
,但是那没有递归,而且它似乎不适用于该页面上使用的重定向类型。
答案1
Wget 工作正常,但您需要引用 URL,因为它没有被转义。
IE
wget 'http://download.osmand.net/download.php?standard=yes&file=Afghanistan_asia_2.obf.zip' -O Afghanistan_asia_2.obf.zip
-O 选项控制输出名称。创建一个 shell 脚本来执行此操作应该相当容易,只要给定一个文件名列表即可。
编辑:您可以通过下载页面并对文件模式进行正则表达式搜索来获取文件名:
wget -nv 'http://download.osmand.net/rawindexes/' -O - | grep -oE "file=[A-Za-z0-9_]*.obf.zip" | cut -c6-
它可以与 xargs 结合并直接通过 wget 来下载每个文件:
xargs -I{} wget 'http://download.osmand.net/download.php?standard=yes&file={}' -O {}
或者完整的单行命令(适用于 Cygwin,其他 *nix 可能需要使用引号和 xargs):
wget -nv 'http://download.osmand.net/rawindexes/' -O - | grep -oE "file=[A-Za-z0-9_]*.obf.zip" | cut -c6- | xargs -I{} wget 'http://download.osmand.net/download.php?standard=yes&file={}' -O {}
答案2
有些文件名中有“-”。因此,获取文件列表的脚本应该用一个字符进行更改。这对我来说有效:
wget -nv 'http://download.osmand.net/rawindexes/' -O - | grep -oE "file=[A-Za-z0-9_-]*.obf.zip" | cut -c6-