シェル/特定の文字列を含むファイルを探す
キーワード
- find
- grep
したいこと
ファイルの中身に特定の文字列を含むファイルを探してリストします。
どうやって
たとえば「HOGE」を含む「.txt」ファイルを探す場合次のようにします。
$ find . -name "*.txt" -exec grep -q HOGE {} \; -print
または次のようにすることもできます。
$ find . -name "*.txt" | xargs grep -l HOGE
ノート
-execする方法
次のようにすると「.txt」ファイルを -exec オプションで grep できます。出力結果は grep の出力結果と同じです。つまりファイル名ではなくファイルの中身です。
$ find . -name "*.txt" -exec grep HOGE {} \;
それでは困るので -print オプションをつけて次のようにしてみます。
$ find . -name "*.txt" -exec grep HOGE {} \; -print
すると先の出力結果に加えてファイル名を出力ます。これは -print オプションが -exec の評価を受け取ってファイル名を出力するからです。
ここで grep に -q オプションをつけると grep の出力を省略できます。
$ find . -name "*.txt" -exec grep -q HOGE {} \; -print
xargsする方法
次のように xargs を使うと「.txt」ファイルをパイプを経由して grep できます。出力結果はやはり grep の出力結果と同じです。
$ find . -name "*.txt" | xargs grep HOGE
それではこまるので grep に -l オプションをつけるとファイル名を出力できます。
$ find . -name "*.txt" | xargs grep -l HOGE
参考
作成日 2014-12-23
