CentOS5 で再帰的 grep しつつ、隠しファイル・ディレクトリ除外

再帰的に grep しながら、.git/ とか .svn/ などの隠しディレクトリや、.bash_history とかの隠しファイルによるノイズを除去する方法です。

よく分かんない動作の内容を推理していくとき、grep が頼りになります。。

そこで「grep を再帰的に実行したい」と思ったのですが、自分の環境ではこれが結構難しく。。

Linux - grepに-rオプションができたのはversion 2.3 - Qiita

-r オプションが使えることを知り、今まで

$ find ./ -type f -print | xargs grep -n [query] | grep -v .svn/

でやっていたのを

$ grep -rn [query] ./ | grep -v .svn/

までに短縮することはできたので、
そこで後半の .svn/ が面倒臭くなり調べたのですが…

Linux - grepで特定のディレクトリを除外する - Qiita

"--exclude-dirオプションはGNU grep 2.5.2から追加された"

バージョン足りないので、これが使えないんですね…はぁ全く。
epel やら remi やらのリポジトリを追加してみましたがなんか入ってないみたいで、
CentOS5 系では今のところ面倒臭そうだなぁという感じ。
もっと何かやれば入るのかもしれませんが、grep 一つにそこまでリソース割きたくないですし、
まぁ入ったとしても毎回 --exclude-dir=.svn 打つなんて面倒臭いし、他にも .bash_history やらなんやら邪魔な隠しファイル・隠しディレクトリは沢山あるし…
だからって ack や ag 入れようにも5系だとこれまた面倒臭い。
Qiita にあったコマンドをコピペして make install しても、エラーが出るだけでインストール出来ません。正直もう触りたくない。

面倒臭くて面倒臭くて堪らないので、オレオレコマンドになってしまいますが、原始的に ~/.bash_profile へ以下を追記しました。
原始 is パワフル.

find による隠しファイル・ディレクトリ除外の参考とか
command line - How to exclude/ignore hidden files and directories in a wildcard-embedded "find" search? - Ask Ubuntu

local query="$1" で1つ目の引数を $query に格納します。
[ $2 ] && local directory="$2" || directory="./" は bash での三項演算子もどきみたいなもので、
2つ目の引数があれば格納、無ければデフォルト引数として ./ を格納します。
最後に、変数展開しながらコマンドを実行していきます。
前半の find でディレクトリパスに /. を含まないファイルの一覧を再帰的に取得し、後半で grep する訳ですね。
大変長いし遅いですが、私の環境では手軽な方法がこれしか見つかりませんので。

実行するときは

$ search test

で OK です。

さっきデフォルト引数を設定したので、grep するときみたいに最後の面倒臭い . を付けなくても自動でカレントディレクトリから検索を実行します。

 

面倒臭いですね。

ではではー