Linuxゲリラ戦記

男 >> 女 ……最後に上書きされた男だけが結婚できるんだよ。

49.ファイルへの追加書き込み・wgetのネットワークタイムアウトの設定

ナックス「はい。本日はファイルへの追加書き込み、及びwgetのネットワークタイムアウトの設定を行いたいと思います」

デビー君「へーい。また何やら難しそうですな」

ナックス「画像収集スクリプト作成に関してですが、一度のクエリで、最高でも8個しか情報が手に入りません」

デビー君「あー。そうだね。クエリで rsz=large って指定して8個手に入れてるけど、これが最高だもんね」

ナックス「そこで、作成するスクリプトでは、while文を利用して繰り返しGoogleAPIにクエリを投げて、一度シェルスクリプトを実行するだけで、たくさんの画像を一気に手に入れられるようにしたいと思っています」

デビー君「ふむふむ」

ナックス「その時、whileを使った繰り返し文ではアドレス情報のahaha.txtへの書き込みのみ行い、繰り返し終了後に、たくさんのアドレス情報が書かれた ahaha.txt に wget を使って一気に画像を取得したいと思っています」

デビー君「うーん。少し分かりにくい」

ナックス「ですよね。ちょっと簡単なイメージを書いてみます」

#!/bin/sh

while[繰りかえして、APIから情報をゲットするぜ!]
do
        curl -e http://www.my-ajax-site.com \〜 なんちゃらかんちゃらでAPIから情報ゲット!

        > ahaha.txt  こんな感じでファイルに書き込む!
done  繰り返し終了!

wget -i ahaha.txt 最後に一気に画像を取得!

デビー君「おぉ。なるほど。イメージは分かる」

ナックス「良かったです。しかし、ここで問題が……」

ナックス「ファイルへ書き込む処理」

> ahaha.txt

ナックス「に関してですが、実はこのリダイレクト。既に書かれている情報を消して、上書きしてしまうのです」

ナックス「つまり、例えばahaha.txtに」

http://●●.jpg
http://▲▲.jpg

ナックス「と書かれている状態で、新しい情報」

http://○○.jpg

ナックス「が書き込まれるとき、リダイレクトを使った方法では」

$ echo "http://○○.jpg" > ahaha.txt

ナックス「最終的に上書きされて、ahaha.txt はこうなります」

http://○○.jpg

ナックス「つまり、while文で繰り返し情報をゲットして、次々に情報を ahaha.txt に書き込んでいきたいと思っても、次々に情報が上書きされていってしまうだけで、結局、一番最後にゲットした情報だけしか ahaha.txt に残らないことになります」

デビー君「なるほどー」

ナックス「そこで出てくるのが追加書き込みです」

>>
追加で書き込む。

ナックス「これを使えば」

$ echo "http://○○.jpg" >> ahaha.txt

ナックス「こうなります」

http://●●.jpg
http://▲▲.jpg
http://○○.jpg

デビー君「へー!一番下に追記されるんだね! >> で追加書き込み、っていうのも感覚的にわかりやすいね」

ナックス「はい。これで今回解説一つ目終了」

ナックス「二つ目は wgetのネットワークタイムアウトの設定です」

デビー君「ネットワークタイムアウト?」

ナックス「はい。前回の48.シェルスクリプトにif文、exit。及び、wgetでは、wgetにチャレンジする回数を指定しました」

ナックス「あれは『ネットワークは画像の元まで届いてるけど、サーバーに問題があるのか、『画像くれ』って言ってもうんともすんとも言わないよー』っていう場合の処理でした」

ナックス「今回教えるのは、『そもそも画像が置いてあるサーバーに届く前に、ネットワークによる接続がうまくいかないよー』って言う場合の処理です」

ナックス「ネットワーク接続が確立されない場合、wgetは結構長時間頑張ります。いや、頑張ってしまいます」

ナックス「私は、頑張るな!と言いたい。お前はもう、よくやったと!戦わなくて良いんだと!あとは龍の力を持つ戦士、ドラゴンに任せろと!」

デビー君「なんのこっちゃ」

ナックス「とりあえず、この長時間がんばってしまうwgetを、30秒だけ頑張るように、オプションを使って設定したいと思います」

wget -T タイムアウトする時間
タイムアウトする時間(秒)を指定する

ナックス「というわけで、今までのシェルスクリプトのwgetの部分を書き換えます(ついでにリダイレクトの > の箇所も >> に変えました)」

#!/bin/sh

if [ -z $1 ]
then
        echo "検索キーワードを入れてください"
        echo "下記に例を示します"
        echo "\$ ${0} \"ペンギン 壁紙\""
        exit
fi

keyword=$1
keyword=`echo $keyword | nkf -wMQ | tr = %`
curl -e http://www.my-ajax-site.com \
        http://ajax.googleapis.com/ajax/services/search/images?q\=${keyword}\&v\=1.0\&hl\=ja\&rsz\=large\&start\=0\&safe\=off \
| tr , \\n | grep "url" | sed -e 's/"url"://g' -e 's/"//g' >> ahaha.txt
wget -T 30 -t 1 -i ahaha.txt
rm ahaha.txt

デビー君「おお」

wget -t 1 -i ahaha.txt

デビー君「だったのが」

wget -T 30 -t 1 -i ahaha.txt

デビー君「に変わったね」

ナックス「そうですね。これで、wgetは30秒ネットワークが確立できなかったら諦めてくれます」

ナックス「今回はここまで。次回から、少しずつシェルスクリプトを本格的に作成していきたいと思います(50.GoogleAPIで取得できる画像の最大個数。最大個数以下の取得方法)」

このエントリーをはてなブックマークに追加