#!/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リンクを使用して* 1.jpgファイルを* 20.jpgとしてhttp://foo.bar/some-image-20.jpg
返します。
http://foo.bar/some-image-{1,2,3,4,5,…,18,19,20}.jpg
エコーから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
ワイルドカードのダウンロードをサポートするWebサーバーはありません。各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 -
これは、ファイル(この場合はstdin)から取得するURLのリストを読み取るwgetのオプションを利用するため、-i
ファイルのリストをwgetにパイプすることができます。
(実行する前にダウンロードする内容を表示するには、wget -i -
に置き換えてくださいcat
。)
答え2
http://foo.bar/some-image-{1,2,3}.jpg
単語リストのbashソース構文ですhttp://foo.bar/some-image-1.jpg
。ソース構文は、変数が拡張されたときに発生するのではなく、スクリプトに入力した内容を意味します。実行したいコマンドを表示します。http://foo.bar/some-image-2.jpg
http://foo.bar/some-image-3.jpg
echo "$output"
wget http://foo.bar/some-image-{1,2,3}.jpg
URLでは中かっこが無効なためwget
エンコーディングAs%7B
と%7D
。これはあなたの質問とは関係ありません。サーバーは、既存のファイルを参照しないURLのみを表示します。
コマンドラインから3つ(私の場合は20)の異なるURLをwgetに渡す必要があります。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 "$@"