web-dev-qa-db-ja.com

ファイル名に正規表現の一致が含まれているフォルダー内のすべてのファイルを見つけるにはどうすればよいですか?

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

たとえば、次の正規表現に一致する名前を含むホームフォルダー内のすべてのファイルを検索したいと思います(ここでは、JavaScriptスタイルの表記法を使用しています):((R|r)eading(T|t)est(D|d)ata)

4
Anderson Green

Findの-nameオプションはファイルグロビングをサポートしています。また、限定された大括弧式のような限定された正規表現のようなオプションのセットもサポートしますが、実際の正規表現の一致には-regexを使用します。

ファイルのcontentsで一致を探している場合は、Craigが示唆したようにgrep -rを使用します。

ファイル名を一致させる場合は、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で十分な場合があります。シェルとしてbashを使用している場合は、Gillesのglobstarソリューションも機能するはずです。

3
ghoti

シェルには ワイルドカード文字 があり、通常の正規表現構文とは異なります。_?_は任意の1文字に一致し、_*_は任意の数の文字に一致し、_[abc]_は一致しますab、またはcの中の任意の1文字。次のコマンドは、現在のディレクトリにある名前が拡張正規表現(_((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*
_

シェルのワイルドカード文字は、正規表現ほど強力ではありません。たとえば、または(_|_)演算子はありません。あなたは正規表現の力を得ることができますが、歴史的な理由により異なる構文を使用しています。 _shopt -s exgblob_を_.bashrc_に追加すると、@(foo|bar)を使用してfooまたはbar(EREの_foo|bar_など)と一致させることができます)、*(pattern)は、任意の数のpatternのシーケンスに一致します(EREの_(pattern)*_など)。+(pattern)は、1つ以上のオカレンスに一致します。 ?(pattern)は0回または1回の出現に一致し、!(pattern)patternを除くすべてに一致します(EREに相当するものはありません)。

¹ 「拡張正規表現」(略してERE)は、JavaScriptが使用する正規表現構文のUNIX名です。

grepは再帰的です-rオプション。これにより、すべてのサブディレクトリ内のすべてのファイルでパターンを検索します。

-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'

1
cas

あなたはパターンを渡すだけで見つけることができます:

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

質問の特定のパターンについては、単に大文字と小文字を区別しない検索を使用できます。

$ find . -type f -iname readingtestdata
0
terdon