ウェブサイト検索

Linuxでディレクトリ名を再帰的に検索する方法


Linuxではすべてがディレクトリに保存されており、bashスクリプトを書く際には、名前でディレクトリを検索することがよく便利です。幸運なことに、findコマンドを使ってディレクトリ名を再帰的に検索し、一致するものを表示することができます。

ディレクトリを検索する

findコマンドは、Linuxのディレクトリ内を検索するために使用されます。デフォルトでは完全に再帰的であり、すべてのサブディレクトリを検索して一致するものを探します。

もしあなたがそれを使うなら

-type d

フラグ find は「ディレクトリモード」で動作し、ファイルを一致させることなくディレクトリのみを検索します。名前でディレクトリを検索するために -name と一緒に使用することができます。

find . -type d -name "search"

このコマンドは現在のディレクトリから始まりますが、~のような他のディレクトリでも検索できます。

問題は、-nameを使用すると、直接の名前のみが一致するため、ディレクトリ名全体と一致しなければ失敗するということです。ただし、これを解決するためにワイルドカードを使用できます。検索文字列の前後にワイルドカードを置くことで、ディレクトリ名のどこかに部分文字列が一致します。また、ファイル名も含める場合、特定の拡張子で終わるファイルに一致させるためにワイルドカードを使用できます。

find . -type d -name "*search*"

ただし、これはディレクトリの名前にのみ一致し、親ディレクトリは無視されます。ファイルパス全体を使用して一致させたい場合は、以下で説明されているRegexオプションを使用する必要があります。

findは、マッチするすべてのディレクトリのリストを出力しますが、最終的な応答に影響を与えるため、絶対パスまたは相対パスのいずれかを一貫して使用するよう注意する必要があります。相対パスを使用する場合、現在のディレクトリを示すためのドットのように、応答は相対的になります。しかし、パスを直接指定すると、たとえそれが現在のディレクトリでも、パスはルートから始まる絶対パスになります。

findは単なるテキスト検索以上のことも行います。タイムスタンプ、ファイルサイズ、その他のLinux識別子に基づいてファイルをマッチさせることができます。また、-execオプションを使って各ファイルやディレクトリに対してコマンドを実行することもできます。

正規表現を使用して検索する

より高度なフィルタリングを行うために、findを使用して正規表現(Regex)と組み合わせて、複雑な検索クエリの一致を見つけることもできます。

Regexを使用する主な利点の一つは、基底ディレクトリを含むディレクトリ全体と一致することです。

-nameの代わりに-regexを使うことができます。また、-regextype sedを使用することで、sed互換のRegexをオンにすることも助けになります。

find . -type d -regextype sed -regex ".*one/.*"

この例では、正規表現は .*one で始まり、「one」で終わるすべてのディレクトリに一致します。ピリオドとワイルドカードは、これに至る任意の部分文字列に一致します。その後、ディレクトリの終わりに一致させるためにスラッシュが / でエスケープされ、さらに任意のディレクトリ名に一致させるために別のワイルドカードがあります。

全体として、これは親が「one」で終わる任意のディレクトリに一致します。それがサブディレクトリ内であってもです。正規表現は強力であり、自分が望むことに正確に一致するように注意する必要があります—それ以上でもそれ以下でもありません。

findとgrepを使用する

コマンド find は生のディレクトリのリストを出力することもできるので、他のコマンドにパイプして処理することができます。例えば、コマンド grep はテキスト検索ユーティリティとして使用され、シンプルな検索やハイライトのためにコマンドラインで素早く使用できます。

find . -type d | grep foo

grepは独自の完全な検索ユーティリティでもあり、正規表現などのツールと組み合わせて検索を強化することができます。それについての使い方ガイドをお読みいただくと、さらに詳しく学ぶことができます。

関連記事: