おまじないの綴り方

spelling of a logical spell

xargs + wget で ファイルリストにあるurlをすべて落として名前をつける

目標

  • 事前に用意したurlリストに記述されたURLをまとめてダウンロードする
  • 落としたファイルの名前を元々のURLにファイル名として使えない文字が入っていると辛いので、保存先の名前を少し置き換える

それぞれ単独ならオプション1つだけで実現できるのに、同時に実現しようとすると急に辛くなる

参考: 単独で動かす場合

事前に用意したurlリストに対してまとめて落とす

wget -i ファイル名
例: wget -i urlList.txt

ファイル名を設定する方法

wget -O 保存先ファイル名 URL
例: wget -O おまじないの綴り方.html http://spell-spell.hatenablog.com/entry/2017/03/25/175513

やり方

検証環境

bash on windows Linux 4.4.0-43-Microsoft #1-Microsoft Wed Dec 31 14:42:53 PST 2014 x86_64 x86_64 x86_64 GNU/Linux

準備

wget -i で使えるような普通のurlではなく、urlの一部からなる保存ファイル名を記載したリストを作る

例:自分のブログをgoogleで調べたときの結果を調べることを想定。 https://www.google.co.jp/search?q=検索クエリ というURLで検索できるので、今回は検索クエリの部分をファイル名にすることにする。 以下のようにファイル名を並べたファイルをfile_name.txtとして保存する。

おまじないの綴り方
うらがみずむ

コード

xargs -a file -I{} wget -O {}.html URL_prefix/{}
例: xargs -a file_name.txt -I{} wget -O {}.html https://www.google.co.jp/search?q={}

説明

xargs

xargsは標準入力として受け取った文字列を任意のコマンドの引数として渡すことができるコマンド。 以下の例ではecho “abc”| によって受け取った"abc"という文字列をxargsの後ろのechoに渡している

$ echo "abc" | xargs echo
abc
$

汎用性が極めて高いコマンドなので理解するのがやや難しいですが、ネット上の情報も多いので、他のサイトも調べてみるといいかもしれません。

aオプション

パイプ等で標準入力を受け取る代わりに、ファイルから読み取った文字列を引数として渡せるオプション。

I(大文字のアイ)オプション

直後に指定した文字列を置換用の文字列して指定できるオプション。 例えば以下の様に使用する。

$ (例)echo "abc" | xargs -I{} wget {}.html
$ (置換後)wget abc.html

例はabcという文字列をxargs経由でwgetに渡した例。-I{}によりxargsで渡ってきたabcが{}という文字列と置き換わるので、結局この例はwget abc.htmlというコマンドと等価になる。

wgetとの連携

xargs -I{} により、wgetコマンドの部分に記述されている{}の部分はxargsから渡された文字列に置き換わる。 そのため、file_name.txtに"おまじないの綴り方"と"うらがみずむ"が記録されている場合、

xargs -a file_name.txt -I{} wget -O {}.html https://www.google.co.jp/search?q={}

を実行すると"おまじないの綴り方"と"うらがみずむ"が文字列としてwgetに渡され、{}が置き換わるので、

wget -O おまじないの綴り方.html https://www.google.co.jp/search?q=おまじないの綴り方
wget -O うらがみずむ.html https://www.google.co.jp/search?q=うらがみずむ

が順番に実行され、本来ならsearch?q=おまじないの綴り方.htmlというファイル名で保存されるところが、おまじないの綴り方.htmlとして保存される。

注意点

  • 上記の様にgoogleの検索結果に対してwgetを書ける場合はユーザーエージェントの偽装を別途行う必要がある
  • bash on windows環境で上記を動かす場合は、file_name.txtの改行コードをLFにしないと動かない