複数の類似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リンクを使用して* 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.jpghttp://foo.bar/some-image-3.jpgecho "$output"

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

URLでは中かっこが無効なためwget エンコーディングAs%7B%7D。これはあなたの質問とは関係ありません。サーバーは、既存のファイルを参照しないURLのみを表示します。

コマンドラインから3つ(私の場合は20)の異なるURLをwgetに渡す必要があります。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 "$@"

関連情報