2009-01-14 11:46:42
wgetでURLが存在すれば0を、存在しなければ1以上を返す
テーマ:ブログ
シェルスクリプトを組む場合、変数は冗長な文字列よりも整数にしておきたい事があります。
またその方が管理が楽になる場合も多々あります。
test [www.pinkdragon.net] コマンドでの扱いが楽になるよう、
URLのファイルが存在するかどうかを整数で返すようにします。
以下駄文となるため、飛ばす方はこちら [ameblo.jp/pclindesk]をクリック。
wget [itpro.nikkeibp.co.jp] コマンドは、ファイルをダウンロードするのにfetch [x68000.q-e-d.net] 同様に重宝するコマンドです。
wget は通常的に使うと、HTTP/FTP通信にてファイルを取得するコマンドですが、--spider オプションをつけると、ファイルはダウンロードせずにファイルの存在有無を確認しようとします。
試しにgoogle社のトップページでチェックしてみます。
といった感じになります。
またファイルが存在しなかったり、ホスト名が存在しない場合はこのようになります。
ここからファイルが存在した場合と、存在しなかった場合の出力を比べて、出力を加工していきます。
wget の基本的な出力は全て標準エラー出力されるようなので標準エラー出力をリダイレクト [x68000.q-e-d.net]します。
また出力を振り分けるのに grep [www.linux.or.jp] コマンドを使います。
"unable to resolve host address"という単語と"404 Not Found"という単語は使えそうなので利用し、できたのがこれです。
grepで絞った出力を wc -l で行数に変えます。
この出力はC流ではなく、ファイルが存在する時に0を、存在しないときに0以外を出力することに注意が必要です。
またファイルが存在しなかった時にリダイレクトするサーバも見かけるため 302 Found だった場合にも0以外を返すようにします。
あとは、これらを test の中でバッククォート`で囲めば整数で比較できるようになります。
URLのファイルが存在するかどうか確認するコマンドがあるかも知れないので、ご存知の場合はコメントをいただければと思います。
追記. 2008-01-14
書き終わってから気づきましたが、ファイルが存在したときとしなかった時は wget のステータスが立つようです。
前回のプロセスの終了時のステータス [cyberam.dip.jp] は echo $? などで確認できるますが、
前もって wget -q --spider としておき、直後の if で $? をを比較すればより簡単なようです。
またその方が管理が楽になる場合も多々あります。
test [www.pinkdragon.net] コマンドでの扱いが楽になるよう、
URLのファイルが存在するかどうかを整数で返すようにします。
以下駄文となるため、飛ばす方はこちら [ameblo.jp/pclindesk]をクリック。
wget [itpro.nikkeibp.co.jp] コマンドは、ファイルをダウンロードするのにfetch [x68000.q-e-d.net] 同様に重宝するコマンドです。
wget は通常的に使うと、HTTP/FTP通信にてファイルを取得するコマンドですが、--spider オプションをつけると、ファイルはダウンロードせずにファイルの存在有無を確認しようとします。
試しにgoogle社のトップページでチェックしてみます。
googleのトップページを取得
$ wget --spider http://www.google.co.jp/
Spider mode enabled. Check if remote file exists.
--2009-01-14 11:20:51-- http://www.google.co.jp/
Resolving www.google.co.jp... 66.249.89.147, 66.249.89.99, 66.249.89.104
Connecting to www.google.co.jp|66.249.89.147|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 0 [text/html]
Remote file exists and could contain further links,
but recursion is disabled -- not retrieving.
--2009-01-14 11:20:51-- http://www.google.co.jp/
Resolving www.google.co.jp... 66.249.89.147, 66.249.89.99, 66.249.89.104
Connecting to www.google.co.jp|66.249.89.147|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 0 [text/html]
Remote file exists and could contain further links,
but recursion is disabled -- not retrieving.
といった感じになります。
またファイルが存在しなかったり、ホスト名が存在しない場合はこのようになります。
ファイルやホスト名が存在しない
$ wget --spider http://www.googleeeeeeeeee.co.jp/
Spider mode enabled. Check if remote file exists.
--2009-01-14 11:22:08-- http://www.googleeeeeeeeee.co.jp/
Resolving www.googleeeeeeeeee.co.jp... failed: Unknown host.
wget: unable to resolve host address `www.googleeeeeeeeee.co.jp'
$ wget --spider http://www.google.co.jp/doesntexists.html--2009-01-14 11:22:08-- http://www.googleeeeeeeeee.co.jp/
Resolving www.googleeeeeeeeee.co.jp... failed: Unknown host.
wget: unable to resolve host address `www.googleeeeeeeeee.co.jp'
Spider mode enabled. Check if remote file exists.
--2009-01-14 11:23:36-- http://www.google.co.jp/doesntexists.html
Resolving www.google.co.jp... 66.249.89.99, 66.249.89.104, 66.249.89.147
Connecting to www.google.co.jp|66.249.89.99|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
Remote file does not exist -- broken link!!!
--2009-01-14 11:23:36-- http://www.google.co.jp/doesntexists.html
Resolving www.google.co.jp... 66.249.89.99, 66.249.89.104, 66.249.89.147
Connecting to www.google.co.jp|66.249.89.99|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
Remote file does not exist -- broken link!!!
ここからファイルが存在した場合と、存在しなかった場合の出力を比べて、出力を加工していきます。
wget の基本的な出力は全て標準エラー出力されるようなので標準エラー出力をリダイレクト [x68000.q-e-d.net]します。
また出力を振り分けるのに grep [www.linux.or.jp] コマンドを使います。
"unable to resolve host address"という単語と"404 Not Found"という単語は使えそうなので利用し、できたのがこれです。
URLのファイルが存在しない場合に0以外を返す
$ wget --spider http://www.google.co.jp/ 2>&1 | grep -Ei "(unable to resolve host address|404 not found)" | wc -l
grepで絞った出力を wc -l で行数に変えます。
この出力はC流ではなく、ファイルが存在する時に0を、存在しないときに0以外を出力することに注意が必要です。
またファイルが存在しなかった時にリダイレクトするサーバも見かけるため 302 Found だった場合にも0以外を返すようにします。
302 foundもファイルが無いように扱う。
$ wget --spider http://www.google.co.jp/ 2>&1 | grep -Ei "(unable to resolve host address|404 not found|302 found)" | wc -l
あとは、これらを test の中でバッククォート`で囲めば整数で比較できるようになります。
URLのファイルが存在するかどうか確認するコマンドがあるかも知れないので、ご存知の場合はコメントをいただければと思います。
追記. 2008-01-14
書き終わってから気づきましたが、ファイルが存在したときとしなかった時は wget のステータスが立つようです。
前回のプロセスの終了時のステータス [cyberam.dip.jp] は echo $? などで確認できるますが、
前もって wget -q --spider としておき、直後の if で $? をを比較すればより簡単なようです。