yuu_nkjm blog
2009-11-28(Sat) [長年日記]
[find][grep][xargs][command] findした検索結果に含まれるファイルに対してgrepを実行
やりたいこと(シナリオ)
/srv/www以下のファイルで,2009という語が含まれている行を抽出したい.基本的には,ファイル名に*.htmlを含むファイルを選び出し,そのファイルから2009を含む行を抽出する.
xargs
一番使う.
# 手抜き find /srv/www -name \*.html | xargs grep -nH 2009 # 特殊文字対策 find /srv/www -name \*.html -print0 | xargs -0 grep -nH 2009 # locateは便利なんだけど,どこのどのファイルがインデックス対象になっているかを注意する必要がある. locate /srv/www/*.html|xargs grep -nH 2009
find
- nameにはワイルドカードが使える.ワイルドカードを使う場合は,エスケープする必要がある.
- {}は検索で引っかかったファイル名が入る.{}と\;の間にスペースが必要なことに注意する.\;となっているのは,;をシェルに解釈させないため.
- -printを指定しなくてもデフォルトが-printなことが多いので,面倒な時はタイプしないことも.
- 検索対象ディレクトリは複数が可能. "find /srv/www /home/user/public_html -name \*.html" -print
- findだけで頑張る.
# プレースホルダ{}あたりの書き方がややこしいので,xargsを使ってしまうことが多い. # findの結果が多いときもxargsの方が有利. find /srv/www -name \*.html -exec grep -nH 2009 {} \; find /srv/www -name "*.html" -exec grep -nH 2009 {} \;
grep
- nで行番号表示,Hでファイル名表示.
-
ファイル名でフィルタリングしなくていいなら,これが楽. grep -rnH 2009 /srv/www