Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

ワンライナー覚え書き

とある blogspot.com の過去記事を一括ダウンロードしたいなー、と思いちょろっとググったらこんなスクリプトを書いてる人がいました。

wget -q -O- "http://google.blogspot.com" | grep "archive.html" | sed -e 's/>[^<]*<//g' | sed -e "s/<a\ class='post-count-link' href='//g" | sed -e "s/'\/a>//g" | xargs wget -np -nc -l 1 -r

おおーこりゃ便利!!と、あっさり当初の目的は達成できたわけですが、sed の部分が気に入らないちょっくら ruby で書き直そう・・・などと強引に慣れないワンライナーで済まそうとアチコチぐぐって時間を浪費しうまく動かなくて、ワンライナーにするためのスクリプト書いて検証しちゃったりして(←よくあるパターン)、もう目的の過去記事のダウンロード終わってるのにまだスクリプトいじってて、嫌になったので重い腰をあげていつも調べてることをメモっとく。

コマンドラインオプション*1

-e 文字列をスクリプトとして解釈させる。必須。
-n 一行ずつ処理する。
-p 一行ずつ処理した後、print $_ してくれる。
-r ライブラリを読み込む。require 'rubygems' したいときは、-rubygems とか書くとスタイリッシュ(かも)。

ワンライナーの書き方忘れてたらざっと読む

http://www.fepus.net/ruby1line.txt

ついでに wget のオプション*2

-nc -no-clobber 既にファイルが存在する場合はダウンロードで既存ファイルを上書きしない。
-O --output-document=FILE ダウンロードした内容をFILEに出力する。
-r --recursive 再帰ダウンロードを行う。
-l --level=NUMBER 再帰ダウンロード時の最大階層深度をNUMBERに設定する。
-np --no-parent 親ディレクトリ(フォルダ)を対象外にする。
-N --timestamping タイムスタンプを比較して、ローカルに既に存在するファイルよりも新しいファイルだけを取得する。

微妙な出来・・

ruby -ropen-uri -e "puts open('http://google.blogspot.com').select{|e|e=~/archive.html/}.map{|e|e.scan(/'([^']+)'/)[1]}" | xargs wget -np -nc -l 1 -r

*1:よく使うのだけ

*2:よく使うのだけ