Linuxゲリラ戦記

wgetで時間がかかり過ぎるのをどうにかする。

左を向いているペンギンみたいなキャラクター、ナックス

54.wgetで時間がかかり過ぎるのをどうにかする

ナックス「こんにちは。画像収集するシェルスクリプトを作ってみたい。今回は第19回」

ナックス「今回は前回の53.画像ファイルをダウンロードするで作成したシェルスクリプトの実行時間が長過ぎるのをどうにかします」

ナックス「実行時間が長過ぎる理由は、wgetコマンドが頑張り過ぎるからです」

デビー君「wgetコマンドが頑張り過ぎる?」

ナックス「もし画像がなかなかダウンロードできない場合、wgetコマンドは900秒間(15分間)も頑張るそうです」

デビー君「そんなに?」

ナックス「しかも、画像ダウンロードに失敗しても20回再挑戦するそうです」

デビー君「確かに頑張り過ぎかも?」

ナックス「そこで今回はwgetコマンドにオプションを指定して、頑張り屋さんから、フニャけた野郎に変えます!」

デビー君「!!」

ナックス「まず、タイムアウト指定(なかなかダウンロードできない場合、何秒間頑張るかの指定)ですが、『wget --timeout=何秒間頑張るか』みたいに指定できるそうです」

wget --timeout=何秒間頑張るか

ナックス「今回は10秒だけ頑張るように指定しましょう。『wget --timeout=10』と指定すれば、10秒だけ頑張ってくれそうです」

wget --timeout=10

ナックス「リトライ回数(ダウンロードに失敗した場合、何回再挑戦するか)は『wget --tries=リトライ回数』みたいにすれば指定できるそうです」

wget --tries=リトライ回数

ナックス「今回は1回だけリトライするようにしましょう。『wget --tries=1』と指定すれば、1回だけ再挑戦してくれそうです」

wget --tries=1

ナックス「ちなみに『wget --tries=0』という風に0を指定すると無制限に頑張る……つまり、永遠に頑張ってしまうそうなので気をつけて」

ナックス「よし!というわけでシェルスクリプトをチャチャっと修正しますか」

ナックス「CUI環境を立ち上げて『cd imagework』とコマンドを打ってimageworkディレクトリに移動してください」

$ cd imagework

ナックス「まずは前回ダウンロードした画像ファイルを全て削除しましょう。なぜなら今回もダウンロードするからです。gazouディレクトリの中のファイルを全て削除するには『rm gazou/*』とコマンドを打つといいです。が!こうコマンドを打つと『このファイルを消していい?』と一つ一つ確認してきて、いちいちyesの意味を持つyを記入してEnterキーを押す、という作業を繰り替えないといけないかもしれません」

ナックス「そういう場合はCtrlキーを押しながらCキーを押して一旦rmコマンドを停止した後、rmコマンドに使える-fオプション(強制オプション)を使って『rm -f gazou/*』という風にコマンドを打てば『このファイル消していい?』といちいち確認されることなく強制的に全ファイル削除できます」

$ rm -f gazou/*

ナックス「gazouディレクトリの中のファイルを全て削除したら、次は『nano imageget.sh』とコマンドを打って、imageget.shファイルをnanoで開いてください」

$ nano imageget.sh

ナックス「3行目のコードを『wget -P gazou --timeout=10 --tries=1 -i list.txt』に修正します」

#!/bin/sh
wget -O - "https://linuxgerira.com/imagesearch.php?q=%E5%85%AC%E5%BC%8F%E5%A3%81%E7%B4%99&page=1" | grep "<img" | sed -e 's/  <img src="//g' | sed -e 's/".*>//g' > list.txt
wget -P gazou --timeout=10 --tries=1 -i list.txt

nanoを起動して3行目のコマンドを編集する

ナックス「変更したら、Ctrlキーを押しながらOキーを押した後に、Enterキーを押してファイルを保存し、Ctrlキーを押しながらXキーを押してnanoを終了してください」

ナックス「最後に『./imageget.sh』とコマンドを打って、実際にこのシェルスクリプトを実行してみましょう」

$ ./imageget.sh

imageget.shシェルスクリプトを実行する

imageget.shシェルスクリプトの実行結果

ナックス「『ls gazou』とコマンドを打てばgazouディレクトリの中のダウンロードしたファイルが確認できるよ」

$ ls gazou

ナックス「GUIアプリからgazouディレクトリを見てみても確認できるよ」

GUIアプリからgazouディレクトリを見てみる

ナックス「CUI環境でダウンロードした画像ファイルをGUI環境で確認するだと!?と思うかもしれませんが、GUI環境はCUI環境をグラフィカルにしただけのものなので、あなたがどんなLinuxを使っていたとしてもGUIでファイルを確認できる方法は基本的にあるはずです。17.あれ?そういえば、ホームディレクトリにダウンロードした画像はどうやって見るの?とかも確認してね」

ナックス「よし。今回までで画像ファイルをダウンロードする、基本編は終わりだ」

ナックス「次回から好きな検索キーワードで画像ファイルをダウンロードする編の始まりだ(予定)」