#!/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。您可以使用eval
bash 将变量的内容解析为源代码,以利用其大括号扩展功能,但首先构建列表会更容易 - 这并不比构建字符串更困难大括号。
#!/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 "$@"