find コマンドを使用して、検索文字列を含むテキストファイルを
検索する方法を紹介します。
| $ find <検索するディレクトリ> -exec grep <検索文字列> {} /dev/null \; |
出力結果は、下記のように表示されます。
| <相対パスおよびファイル名>:<検索文字列を含む行> |
下記は、カレントディレクトリ以下のファイルで、Solaris という文字列を
検索する例です。
$ find . -type f -exec grep Solaris {} /dev/null \; ./dir1/test3.txt:OpenSolaris ./test1.txt:Solaris ./test2.txt:Solaris をインストールする。 |
こちらの方法は、どこのファイルに検索文字列が含まれているかを探す時に
とても便利です。
ここからは、構文について説明します。
まず、
こちらは、プレーンテキストのみを検索する時に使います。
| -exec <コマンド> {} /dev/null \; |
-exec で <コマンド> を実行します。{} には、find コマンドにより検索したファイルの
ファイル名が入るとお考えください。{} および ; を付けると、1 回ではなく複数回
<コマンド> を実行します。\ は、\ の次に来る ; を SHELL に認識されないように
(find コマンド用の文字列であることを示すために)付けます。
次に /dev/null についてですが、こちらは別に /dev/null である必要は
ありません。検索文字列に引っかからないようなファイルであれば、何でも
構いません。なぜ、ここに /dev/null を記載する必要があるかと言うと、
まず grep の元々の出力方法を思い出してください。
例えば、1 つの test1.txt ファイルに含まれる Solaris 文字列を grep する場合は、
出力結果にtest1 のファイル名および相対パスは表示されません。
$ grep Solaris ./test1.txt Solaris |
それを複数のファイルを grep で調べる場合は、出力結果にファイル名および相対パスが
表示されます。
$ grep Solaris ./test1.txt ./test2.txt ./test1.txt:Solaris ./test2.txt:Solaris をインストールする。 |
この方法を用いるために、下記の構文を使用しています。
| -exec grep Solaris {} /dev/null \; |
{} には、前述したように find で検索したファイル名が 1 つずつ入ります。
そうすると毎回 -exec により 1 回目は
| grep Solaris test1.txt /dev/null |
2 回目は
| grep Solaris test2.txt /dev/null |
といった形で、test1.txt と /dev/null を、2 回目は test2.txt と /dev/null を
grep することになります。この構文を繰り返し使用するために、/dev/null または別の
ファイル名を記載するというわけです。
結果として、どこのディレクトリにある、どのファイルに、検索文字列が含まれているか
分かる、、ということです。
こちらは、野崎さんに教えて頂きました。ありがとうございます。