ファイル名に正規表現の一致を含むフォルダ内のすべてのファイルを検索するには?

ファイル名に正規表現の一致を含むフォルダ内のすべてのファイルを検索するには?

Linux(この場合はUbuntu)のホームフォルダで、特定の正規表現に一致するすべてのファイルを見つけたいと思います。これを行うために使用できる単純なUnixコマンドはありますか?

たとえば、私のホームフォルダで、名前に次の正規表現に一致するすべてのファイルを見つけたいと思います(ここではJavascriptスタイルの表記法を使用)。((R|r)eading(T|t)est(D|d)ata)

答え1

検索-nameオプションはファイルグロービングをサポートします。また、制限された角かっこ式などの制限された正規表現類似オプションのセットもサポートしていますが、実際の正規表現の一致のためには-regex

マッチングをお探しの場合コンテンツgrep -rCraigが提案したように使用されるファイルです。

ファイル名を一致させるには、対応するfindオプション-regexを使用します。

find . -type f -regex '.*[Rr]eading[Tt]est[Dd]ata.*' -print

find括弧内の原子は正規表現ではサポートされていないため、正規表現の変換に注意してください。 Linuxシステムを使用している場合、GNU findは-regextypeより多くの制御機能を提供するオプションをサポートします。

find . -regextype posix-extended -regex '.*((R|r)eading(T|t)est(D|d)ata).*' -print

探しているのが大文字と小文字の一致だけなら、それだけ-iregex-iname十分かもしれません。 Gillesのglobstarソリューションは、シェルとして使用してもbash機能します。

答え2

grep-rパターンのすべてのサブディレクトリ内のすべてのファイルを検索する再帰オプションがあります。

この-lオプションは、このパターンを含むファイルのみを一覧表示します。各ファイルの一致数を確認するには-c-l または -c を使用し、一致を表示するには -l または -c を使用しないでください。

  1. (R|r)それはそれを書くための冗談です[Rr]。また、クラスよりも遅くなります(ただし、何百万回実行されるループに属していない限り、問題になるほど十分ではありません)。

    grep -lr '[Rr]eading[Tt]est[Dd]ata' ~/

  2. 大文字と小文字を完全に区別しない:

    grep -lir 'readingtestdata' ~/

  3. サブディレクトリではなく〜からのみファイルを検索するには、次のものを使用できますfind

    find ~/ -maxdepth 1 -type f -print0 | xargs -0r grep -l '[Rr]eading[Tt]est[Dd]ata'

答え3

殻がありますワイルドカード通常の正規表現構文とは異なり、すべての単一文字に一致し、任意の数の文字に一致し?、または間の単一文字に一致します。次のコマンドは、名前が拡張正規表現 1 と一致する現在のディレクトリのすべてのファイルを表示します。*[abc]abc((R|r)eading(T|t)est(D|d)ata)

echo *[Rr]eading[Tt]est[Dd]ata*

サブディレクトリでもファイルを見つけるには、まずこのコマンドを実行します。shopt -s globstarこのコマンドをに入れることができます~/.bashrc。これにより、**すべてのレベルのサブディレクトリに一致するパターンが開きます。

echo **/*[Rr]eading[Tt]est[Dd]ata*

シェルワイルドカードは正規表現ほど強力ではありません。たとえば、or()演算子はありません|。正規表現の強力な機能を使用できますが、歴史的な理由から別の構文を使用します。shopt -s exgblobアイテムに追加してから、一致または(EREのように)を.bashrc使用し、シーケンスの発生数に関係なく(EREのように)一致し、1つ以上の発生と一致し、ゼロまたは1つの発生と一致そして、以下を除くすべての項目と一致することができます(EREに対応する項目なし))。@(foo|bar)foobarfoo|bar*(pattern)pattern(pattern)*+(pattern)?(pattern)!(pattern)pattern

1 「拡張正規表現」(略して ERE) は、JavaScript で使用される正規表現構文の Unix 名です。

答え4

パターンを渡して次のものを見つけます。

$ find . -type f  -name "[Rr]eading[Tt]est[Dd]ata*"

質問の特定のパターンに対して大文字と小文字を区別しないクエリを使用できます。

$ find . -type f -iname readingtestdata

関連情報