Linuxのホームフォルダー(この場合は、Ubuntu)にある、特定の正規表現との一致を含むすべてのファイルを検索します。これを行うために使用できる簡単なUnixコマンドはありますか?
たとえば、次の正規表現に一致する名前を含むホームフォルダー内のすべてのファイルを検索したいと思います(ここでは、JavaScriptスタイルの表記法を使用しています):((R|r)eading(T|t)est(D|d)ata)
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ソリューションも機能するはずです。
シェルには ワイルドカード文字 があり、通常の正規表現構文とは異なります。_?
_は任意の1文字に一致し、_*
_は任意の数の文字に一致し、_[abc]
_は一致しますa
、b
、または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を使用しないでください。
(R|r)
は[Rr]
。また、クラスよりも低速です(ただし、何百万回も実行されるループ内にある場合を除いて、問題には不十分です)。
grep -lr '[Rr]eading[Tt]est[Dd]ata' ~/
大文字と小文字を完全に区別しない:
grep -lir 'readingtestdata' ~/
〜内のファイルのみを検索し、サブディレクトリ内は検索しない場合は、find
を使用できます。
find ~/ -maxdepth 1 -type f -print0 | xargs -0r grep -l '[Rr]eading[Tt]est[Dd]ata'
あなたはパターンを渡すだけで見つけることができます:
$ find . -type f -name "[Rr]eading[Tt]est[Dd]ata*"
質問の特定のパターンについては、単に大文字と小文字を区別しない検索を使用できます。
$ find . -type f -iname readingtestdata