grepで検索ワードが有る無いファイル一覧をそれぞれ出力する

grepコマンドで対象ディレクトリを再帰的(サブディレクトリを含む)に検索して、検索対象の単語が存在するファイル一覧と、単語が存在しないファイル一覧をそれぞれ出力する方法を書いています。

※ 本ページはプロモーションが含まれています。

このページの目的と動作環境

最終更新日:2023/10/5

本記事は、grepコマンドで特定の対象ディレクトリを再帰的(サブディレクトリのファイル全てが検索対象)に検索して、検索ワードを含むファイル一覧と、検索ワードを含まないファイル一覧をそれぞれ出力する方法について説明しています。

・試したOS環境とgrepのバージョン情報です
OS:macOS Big Sur(バージョン11.7.10)、CentOS Linux 7.9、AWSのAmazon Linux release 2 (Karoo)

■macのgrepバージョン

$ grep -V
grep (BSD grep) 2.5.1-FreeBSD
■CentOS Linux7.9とAmazon Linux 2のgrepバージョン
$ grep -V
grep (GNU grep) 2.20

grepコマンド例。検索単語がある・ないファイル一覧をそれぞれ出力する。対象ディレクトリは再帰的(サブディレクトリを含む)。特定ディレクトリは検索対象から除外。-l,-L,-r,--exclude-dirオプション

まず最初に、オプションiとrを付けて、.(ドット、カレントディレクトリ)以下のファイル一覧を対象に検索します。検索ワードはhogeです。

$ grep -ir hoge .
-iオプション(--ignore-case)は、検索ワードの大文字大文字を区別しないようにします。上のコマンド例だと、hoge・HOGE・Hogeどれも検索にひっかかります。
-rオプション(--recursive)は、指定した検索対象のディレクトリを再帰的に検索します。なので、上のコマンド例だと、カレントディレクトリ以下のサブディレクトリにあるファイル全てが検索対象になります。

次に、オプションl(小文字のl)を付けてgrepを実行します。

$ grep -irl hoge .
-lオプション(--files-with-matches)は、検索ワードを含むファイル名だけを一覧で出力します。
また、検索ワードが1つのファイルに複数個あっても、-lオプションを付ければファイル名の一覧は重複せずに表示されます。

次に、オプションl(小文字のl)ではなく、オプションL(大文字のL)を付けてgrepを実行します。

$ grep -irL hoge .
-Lオプション(--files-without-match)は、-lオプションとは反対に、検索ワードを含まないファイル名だけを一覧で出力します。

また、-rオプションで検索対象のディレクトリを再帰的(サブディレクトリ全て)にgrep検索する場合でも、特定のディレクトリは検索対象から除外したい場合もあると思います。その場合、--exclude-dirオプションを付けます。

このgrepコマンド例は、カレントディレクトリ(.)下にあるhogedir1・hogedir2・.gitの3つのディレクトリは検索対象から除外しています。

$ grep -irL hoge . --exclude-dir={./hogedir1,./hogedir2,.git}
OS環境やgrepのバージョンにもよると思いますが、--exclude-dirオプションで./hogedir1を指定した場合、hogedir1ディレクトリの下にあるサブディレクトリも全て検索の除外対象になります。もしディレクトリが除外対象にならないなら、"./"を抜けせば上手くいく場合もあると思います。
$ grep -irL hoge . --exclude-dir={hogedir1,hogedir2,.git}

■git grepコマンド
Gitを使っていてGit管理下にあるディレクトリをgrepで検索したい場合、grepコマンドではなく、git grepコマンドの方が圧倒的に高速なので便利です。
ただ、git grepコマンドだと使えないオプションをあるっぽいです。例えば、--exclude-dirオプションはエラーが出ます。

$ git grep -irL hoge . --exclude-dir={./hogedir1,./hogedir2,.git}
fatal: option '--exclude-dir=./hogedir1' must come before non-option arguments
git grepコマンドが問題なく使えれば使って、エラーが出るなら普通のgrepコマンドを使う方が良いですね。

まだGitを使った経験がない方はGitは便利ですので、良ければ別記事を参考にしてください。
Gitのすすめ、Gitは個人で使うにも非常に便利なツール
Gitでよく使うコマンドやオプション