grep -lオプションの使い方を完全解説!一致したファイル名だけを表示する方法
生徒
「grepコマンドって検索に使うって聞いたんですけど、たくさんのファイルの中から、どのファイルに一致した内容があるかだけ知りたいときってどうすればいいですか?」
先生
「その場合は、grepの-l(エル)オプションを使うと便利ですよ。『一致したファイル名』だけを表示してくれます。」
生徒
「検索にヒットした中身じゃなくて、ファイル名だけが欲しいときに使えるんですね?」
先生
「その通りです!では、grep -lオプションの基本的な使い方を見ていきましょう。」
1. grep -lオプションとは?
grep(グレップ)とは、Linuxで「文字列を検索するためのコマンド」です。通常は、検索に一致した行の中身を表示しますが、-lオプションをつけることで、「検索に一致したファイル名だけ」を表示できます。
この-lは「list(リスト)」の略と考えると覚えやすいです。つまり「一致したファイルのリストを表示する」オプションです。
2. grep -lの基本構文
使い方はとてもシンプルです。以下の構文になります。
grep -l 検索文字列 対象ファイル
例えば、現在のディレクトリ内にある.txtファイルの中から「apple」という文字列を含むファイル名だけを表示したい場合、次のように実行します。
grep -l apple *.txt
fruits.txt
menu.txt
この例では、「apple」という単語が含まれているファイルがfruits.txtとmenu.txtだったということが分かります。
3. grep -lと通常のgrepの違い
通常のgrepコマンドは、一致した行そのものを表示します。
grep apple *.txt
fruits.txt:apple
menu.txt:green apple juice
それに対して、-lオプションをつけると、行の中身ではなくファイル名だけを表示してくれるのが特徴です。
4. サブディレクトリも含めて検索するには?
もし、サブディレクトリ(下の階層)にあるファイルも含めて検索したい場合は、grep -rlと-r(再帰的)のオプションを組み合わせて使います。
grep -rl apple .
./data/fruits.txt
./memo/menu.txt
このように、「.」は現在のディレクトリを意味し、-rでその中のすべてのフォルダやファイルを対象に検索します。
5. -lのあとに注意すべき点
grepの-lは、一致したらその時点でそのファイルの表示を終了するため、大量の一致がある場合でも高速に処理されます。
また、表示されるのは一致があったファイルのみなので、「一致しなかったファイル」は表示されません。すべてのファイルの確認が必要な場合は、-L(大文字のエル)オプションを使うと、一致しなかったファイル名を表示することもできます。
6. よく使うオプションの組み合わせ例
grepコマンドは他のオプションと組み合わせて使うことで、もっと便利になります。ここでは、-lと相性の良い組み合わせを紹介します。
-l と -i(大文字小文字を区別しない)
grep -il apple *.txt
menu.txt
apple_recipe.txt
-l と -r(再帰的に検索)
grep -rl banana ./recipes
./recipes/fruits.txt
./recipes/smoothie.txt
-l と --include(特定の拡張子だけ検索)
grep -rl --include="*.log" error .
./logs/server.log
./logs/app.log
7. ファイルの中身を見ずに絞り込みたいときに便利
grep -lは、検索キーワードが「どのファイルに含まれているか」だけを把握したいときに最適です。中身の確認はあとで行いたいけど、とにかく対象のファイル名を特定したいときに便利です。
例えば、ログファイルの中から「ERROR」が含まれているログだけを抽出したいときにも使えます。
8. grep -lはスクリプトにも便利
grep -lは、シェルスクリプトや自動処理にもよく使われます。なぜなら、ファイル名だけを出力してくれるので、次の処理につなげやすいからです。
例えば、次のようにxargsコマンドと組み合わせると、一致したファイルを一括でコピーしたり削除したりできます。
grep -l "secret" *.txt | xargs cp -t ./secret_files
このコマンドは、「secret」という文字列が含まれているファイルだけをsecret_filesフォルダにコピーします。