特定の文字列がカレントディレクトリの下のどのファイルにあるのか探したいということはよくある。unixの強者はfindとgrepとxargにsedやcutやuniqを絡めてパイプでつなぐということをするのだそうだけど、毎度そこまでやっていられない。
非常にいい加減ではあるのだけど、以下のようなbash関数を作った (aliasだと引数を取れないので)
function inspect(){
find . -type f -name "*" -print|xargs grep $1 |sed -e "s/^Binary file.*$//g"|sort|uniq
}
見てのとおり、対象はカレントディレクトリ以下限定。一応バイナリファイルの結果は除外する。頭に空行が1つ残ってしまうがそのままにしている。
上を.bashrcに追加して、source .bashrcとすれば使える。
引数は一つ。そのままgrepに与えられるので、検索したい文字は "" で囲んでも囲まなくても使える (もちろんスペースを含む文字列は "" で囲む必要がある)。以下のような感じで使う。
inspect scss
inspect "a??.zip"
#追記
このコマンドは見てのとおりかなり能率が悪いので、ルートディレクトリやそれに近いところで実行したりすると実行完了までものすごい時間がかかる。実行するならせいぜいRailsのアプリケーションディレクトリ程度の深さにしておくこと。
#追記2
コメント欄で以下の方法を教えていただいた。ありがとうございます。xargsやfindをこねくり回すよりはるかにシンプル。マッチした文字列そのものの出力は別になくてもよかったことに今頃気が付いた。
grep -rlI <文字列> .
- rオプション: 再帰探索
- lオプション: files-with-match、マッチしたときのファイル名だけを出力
- Iオプション: バイナリを無視
今度からちゃんとman読もう。
#追記3
The Silver Searcher (ag) の方が断然高速かつ使いやすいことが判明。即座に乗り換えた。
http://qiita.com/yuyuchu3333/items/4c57186e37db9eb3db15