2014年7月13日日曜日

curlで見開き画像をゲットする

知っているヒトには「何、そんなことも知らなかったの?」と言われてしまうことだが、curlで、ちょっと工夫が必要だったケースについて書く。

ことの発端は、curlコマンドを用いてサーバーに置かれた日付を維持して画像をダウンロードすることだった。 curlはとても便利で、これだけで連番や飛び番のファイルを取得することができる。

curl -O "http://www.hoge.com/[01-10].jpg"

curl -O "http://www.hoge.com/[01-10:2].jpg"

curl -O "http://www.hoge.com/{1,3,5}.jpg"

上から連番、2つ置きの連番、そして飛び番の使用例である。(詳細はこちらを参照)

だが、画像ファイルは時折2ページが見開きになっているケースがある。つまり、ファイル名が例えば「11-12.jpg」のようになっているケースである。これはcurl内蔵機能だけでは無理で、forループに一工夫がいる。それは、forループでステップを2にして、変数iとj=i+1を使うことだ。

ステップを2にするのは、

for i in `seq 0 2 10`; do echo $i; done

のようにする。この例では0から10までをステップ2刻みで実行する。これは、こちら(英語)で見つけた。

続いて変数iとj=i+1を使うのは、

let j=$i+1

のようにする。これは「shell script i=1 j=i+1」という恥ずかしい検索語でググって見つけた。(PDF)

shell script 変数 加算でググると、当たり前だがexprがトップヒットする。letは出てこない。こちらに記述されているように、大きなスクリプトであったり、実行時間やCPUリソースを気にする場合でなければどちらでも良いのかも知れないが、

let COUNT=COUNT+1

COUNT=`expr ${COUNT} + 1`

のように、記述はletの方が圧倒的に簡単である。簡単なことは良いことだと信じているので、迷わずletを採用した。

まとめると、

for i in `seq 11 2 15`
> do
> let j=$i+1
> curl -OR http://www.hoge.com/$i-$j.jpg
> done

すなわち、
for i in `seq 11 2 15`; do let j=$i+1; curl -OR http://www.hoge.com/$i-$j.jpg; done

となる。(この例では11から15までを2つおきに3回繰り返している)

curlを使う所以は一括処理にあるわけだから、そもそもどこに見開きページがあるか分からない画像をcurlで処理する理由はないだろう…と思われるかも知れないが、存外、たった2回のループでさえも、便利だったりする。お試しあれ!

0 件のコメント :

コメントを投稿