find と xargs の組み合わせ

function fxg() {
  find -name "*.$1" |xargs grep "$2"
}
function fxgm() {
  cd ~/monaos/mona; fxg "$1"  "$2";cd -
}

function fxgc() {
  cd ~/monaos/contrib; fxg "$1"  "$2";cd -
}

わざわざ cd しないと使えない仕様にしないで検索ディレクトリを指定できるようにすればいいのにとか思った。こんなん。

function fxg() {
    dir=.
    [ $# -gt 2 ] && dir=$3
    find $dir -name "*.$1" | xargs grep "$2"
}

ていうか BSD な find だと第1引数のパスを省略できなかったりする罠。あと chpwd になんか入れてると実行されちゃう。お好みで

function fxg() {
    dir=.
    [ $# -gt 2] && dir=$1 && shift
    find $dir -name "*.$1" | xargs grep "$2"
}

でもいいけど。
あとコメントで出てきているように zsh の glob を使ってもできるけど、マッチするファイル数が多すぎるとコマンドライン長の制限を越えちゃったりする。Linux カーネルとかだと多分アウト。
まぁ、Emacs 使いは grep-find か igrep-find*1でも使っとけって話も。

追記

パスに空白が含まれる可能性がある場合は

function fxg() {
    dir=.
    [ $# -gt 2 ] && dir=$3
    find $dir -name "*.$1" -print0 | xargs -0 grep "$2"
}

としないといけない。念のため。
まぁ、Linux 使っててパスに空白を含むことってあんまりないけど。

*1:要 igrep.el