Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

複数のファイルから特定の文字列を含むファイルを探したい

複数のファイルから特定の文字列を含むファイルを探したい場合です。
具体的な例として、

  • 恐ろしく入り組んだレガシーコードがある
  • そのディレクトリ中から関数(fooBar)を探す
  • コード群の上位ディレクトリに移動済

というケースを想定します。

findとgrepの合わせ技

$ find ./ -type f -print | xargs grep -n fooBar\( /dev/null 

./hoge/hoge.h:55:void fooBar_handler(U8 argc, char **argv);  
./piyo/piyo.h:56:void fooBar_get_buf_cnt(U8 argc, char **argv);
...

xargsが受け取ったファイル群は/dev/nullの後ろに一個一個格納され、評価されていきます。

/dev/null ? 何それ怖い

末尾の/dev/nullはその名の通りnullです。
なんでこんなのをいれるのかというと……
バッファは有限であるからです。
ファイル名のリストは延々と繋がっていきます。
が、ある量以上になると改行が入りそれ以降は別コマンドとして新たに実行されます。
この場合、頭のnullが無いと、一つしかマッチしない行はファイル名が表示されません。
まぁ、ちょっとしたハックなのでしょうかね(まだよくわかってない

grep単独

grepには再帰的にディレクトリを辿るオプション"-r"があります。
これを使えば、上の例は

grep fooBar\( -rn .

でもできます。
短くて良いすね。

まとめ

最初に紹介した例は「決まり文句」との事でした。
ところがどっこい、ちゃんと調査すると見慣れたコマンドのオプションで解決できる話である事が分かりました。
UNIXハッカー達が錬りに錬ったコマンド群に無駄はないのですね……勉強になりました。