シェル関数で指定ディレクトリ以下の全文検索を簡単にする

UNIX系のOSは、標準で含まれる多様なツールによって強力なコマンドライン環境を実現しています。例えば

ある文字列を含むファイルを、その出現箇所とともにリストアップする

といったタスクを達成したいときは、以下のようにfindとgrepを併用すれば出来ます。

find DIR -name "FILE" -exec grep -IHn STRING {} \;

しかし、比較的よく発生するタスクの割にコマンドが複雑なので、よくman findやman grepする羽目になります。そこで、より直感的に使えるコマンドをシェル関数として書いてみました。

function search() { 
  dir=.
  file=*
  case $# in
    0)
    echo usage: search STRING [DIR [FILE]]
    ;;
    1) 
    string=$1
    ;;
    2)
    string=$1
    dir=$2
    ;;
    3)
    string=$1
    dir=$2
    file=$3
    ;;
  esac  
  find $dir -name "$file" -exec grep -IHn $string {} \; ;
}

上記コードを.bashrcか.bash_profileに記述すれば、searchというコマンドが使えるようになります。使い方は以下の通りです。

カレントディレクトリ以下の全てのファイルから特定の文字列を検索し、出現位置をリストアップする

$ search (検索文字列)

指定したディレクトリ以下の全てのファイルから特定の文字列を検索し、出現位置をリストアップする

$ search (検索文字列) (検索ディレクトリ)

指定したディレクトリ以下の指定したファイルから特定の文字列を検索し、出現位置をリストアップする

$ search (検索文字列) (検索ディレクトリ) (検索対象ファイル) # *.c などと指定

このように、与えられた引数に応じて適切であろう振舞いをします。また、よく使うであろう引数ほど最初に指定する仕様になっています。