使用大括号下载多个相似的 URL

使用大括号下载多个相似的 URL
#!/bin/sh
orig=$1

var=${orig%.jpg}
var=`echo "$var" | grep -o "[0-9][0-9]$"`

cutten=${orig%[0-9][0-9].jpg}

sequence='{1,'
for i in `seq 2 $(( $var - 1 ))`; do
sequence=$sequence$i","
done
output=$cutten$sequence$var"}.jpg"

echo "$output"
#wget "$output"

它需要一个 img 链接,例如:http://foo.bar/some-image-20.jpg并返回 http://foo.bar/some-image-{1,2,3,4,5,…,18,19,20}.jpg,即文件 *1.jpg 到 *20.jpg

在 echo 上,当使用 wget 运行时,它按预期工作(输出如上):

-- (Date/Time) -- http://foo.bar/some-image-%7B1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20%7D.jpg
(Proceeds to resolve this whole one link, and fails)

几乎它用“%7B”替换“{”,用“%7D”替换“}”。有任何想法吗?

答案1

我不知道有哪个网络服务器支持通配符下载,您必须单独获取每个 URL。

尽可能多地保留原始脚本,就像这样:

#!/bin/sh
orig=$1

var=${orig%.jpg}
var=$(echo "$var" | grep -o "[0-9][0-9]$")

cutten=${orig%[0-9][0-9].jpg}

for i in $(seq 1 $(($var - 1))) ; do
      echo $cutten$i.jpg
done | wget -i -

这利用了 wget 的-i选项来读取要从文件(在本例中为 stdin)中获取的 URL 列表,因此我们可以将文件列表通过管道传递给 wget。

(如果您想在运行之前查看它将下载什么,请替换wget -i -cat

答案2

http://foo.bar/some-image-{1,2,3}.jpg是表示单词列表http://foo.bar/some-image-1.jpg, http://foo.bar/some-image-2.jpg,的 bash 源语法http://foo.bar/some-image-3.jpg。源语法意味着它是您在脚本中键入的内容,而不是变量扩展时发生的内容。echo "$output"显示您将要运行的命令,即

wget http://foo.bar/some-image-{1,2,3}.jpg

由于大括号在 URL 中无效,wget 对它们进行编码作为%7B%7D.这与您的问题无关:服务器只看到一个 URL,其中包含就其而言不引用现有文件的 URL。

您需要在 wget 的命令行上传递 3 个(在我的示例中,在您的示例中为 20 个)不同的 URL。您可以使用evalbash 将变量的内容解析为源代码,以利用其大括号扩展功能,但首先构建列表会更容易 - 这并不比构建字符串更困难大括号。

#!/bin/sh
suffix=${1##*[0-9]}
prefix=${1%"$suffix"}
last=${prefix##*[!0-9]}
prefix=${prefix%"$last"}

while [ "$last" -gt 1 ]; do
  last=$((last-1))
  set -- "$prefix$last$suffix" "$@"
done

wget "$@"

相关内容