ウェブサイト検索

Linuxで内容ではなくファイル名を検索するためのgrepの使い方


grepは、特定の内容を検索するために通常テキストファイルを検索するために使用されるLinuxツールです。ただし、ファイル内容の代わりにファイル名を検索するためにディレクトリを検索することがしばしば便利であり、これはgrepと他のLinuxコマンドラインユーティリティを使用して行うことができます。

grepの代わりにfindを使用する

grepユーティリティは、本質的にファイルまたは標準入力から文字列入力を受け取り、パターンや正規表現を使用してそれを検索し、一致する行を出力します。

技術的には、grepを単独で使用して、コンテンツではなくファイル名を検索することもできますが、それはLinuxがファイル名の入力でワイルドカードを許可しているからです。しかし、同じように使用することもできます。

ls

この方法でファイルをリストするか、他のコマンドでワイルドカードを使用することはできますが、grepのようにファイル名を検索するための本当の解決策ではありません。

grep "" ./file* -l

実際の解決策は、findユーティリティを使用することで、これによりサブディレクトリを通じて検索でき、ファイルを検索する最も堅牢な方法を提供します。これはディレクトリを検索するために最も一般的に使用されるユーティリティで、多くのオプション---パターンマッチングや正規表現サポートを含む---があります。

最も基本的な使い方は、findを単独で使用して、サブディレクトリを含むファイルのリストを出力し、その入力をgrepに与えることです。すでにgrepを使用しているスクリプトがあれば、この方法に変換するのはかなり簡単です。

find | grep "file"

findを使って直接パターンを使用することもでき、grepの必要がなくなります。入力には-inameを使用してください。

find . -iname 'file_*.txt'

grepとは異なり、findコマンドは少し厳密です---検索文字列をエスケープするためにはシングルまたはダブルクォーテーションを使用する必要があり、完全な文字列と一致させるためにワイルドカードを使用する必要があります。名前の中の部分文字列を単純に見つけることは、名前の残りの部分と一致させるためにワイルドカードを使用しない限り不可能です。

findで正規表現(Regex)を使用する

<code>find</code>と共に通常の表現を使用することもでき、より高度なマッチングが可能です:

find . -regex './file.*'

この正規表現は、現在のディレクトリ内の「file.」で始まるすべてのファイルに一致します。ただし、これは -iname とは異なる動作をすることに注意することが重要です; 入力には完全なディレクトリパスが含まれており、相対パスをエスケープするために ./ を使用する必要があります。

ここに示されているこのコマンドは、./subdirectory/フォルダーを除外しています。なぜなら、それは「file」で始まっていないからです。これを修正するには、最後のスラッシュまでのすべてに.*/を一致させる必要があります。

find . -regex '.*/file.*'

正規表現は非常に複雑ですが、非常に強力です。もっと学びたい場合は、彼らの動作方法についてのガイドを読むことができます。

関連記事: