find + grep をシェルスクリプト化

suzukicui,find,grep,linux,Mac OS X

suzuki です。

「たくさんのファイルの中のどこかに書かれているはずだけど、どのファイルだか分からんけど探さなきゃ!」という作業時には、次のようなコマンドを叩いています。

$ find ./ -type f | xargs grep 'hoge'

grep コマンドだけを使って、次のようにしても良いのですが、ファイルが多すぎるとシェルの1行制限に引っかかってしまうので、普段から上のコマンドを使うクセが付いています。

$ grep -R 'hoge' *

たまに使うだけなら良いんですが、先日この作業を連発するハメになって、さすがにタイプ量の多さに面倒くさくなってしまいました。

ということで、シェルスクリプト化してみました。

実際のところ、スクリプトの中ではたいしたことはしていません。

Mac OS X と Linux (CentOS) でコマンドの格納ディレクトリが違う部分を吸収したり、引数無しで呼ばれた場合は、ごく簡単な「使い方」を表示するルーチンを加えているくらいです。

#/bin/sh

# 各コマンドの定義
FIND='/usr/bin/find'
XARGS='/usr/bin/xargs'

## Mac OS X / CentOS でコマンド格納位置の差を吸収
if [ -f /bin/grep ]; then
    GREP='/bin/grep'
elif [ -f /usr/bin/grep ]; then
    GREP='/usr/bin/grep'
fi

if [ -f /bin/basename ]; then
    BASENAME='/bin/basename'
elif [ -f /usr/bin/basename ]; then
    BASENAME='/usr/bin/basename'
fi

# 引数を取得
SEARCH=$1

# 使い方の表示
function usage() {
    NAME=`$BASENAME $0`
    echo $NAME search_word
}

# 引数が無かったら使い方を表示
if [ "$SEARCH" == '' ]; then
    usage
    exit 1
fi

# 実行
$FIND ./ -type f | $XARGS $GREP -i "$SEARCH"

このシェルスクリプトを PATH が通ったところへ fgr という名前(Find GRepのつもり)で保存します。もちろん、他の名前でも構いません。ネーミングセンスには自信がないので、何か良い名前があったら、ぜひ教えて欲しいところです(笑)

使い方は次のとおり。出力結果は、普通に find と grep を組み合わせただけのものなので、ここでは割愛します。

$ fgr [検索語]

超単純なので、find や grep のオプションを変えたりして自分好みにカスタマイズしてください。

suzukicui,find,grep,linux,Mac OS X

Posted by suzuki