Linuxの「find -regex」はバインディングを処理しません

Linuxの「find -regex」はバインディングを処理しません

以下のファイルがあり、次のように一致させる必要があります。

./foo.bar1.sh       -match

./qux/foo.bar2.sh   -match

./foo.sh            -match

./baz.sh            -no match

./foo.bar3          -no match

私が試してみました:

find . -regex ".*foo(bar[0-9])?\.sh"

しかし、何も返されません。なぜその正規表現が機能しないのかわかりません。

答え1

正規表現に 2 つのエラーがあります:

  1. の後の(文字通りの)ドットが抜けていますfoo

  2. find括弧をエスケープする必要があるない文字通りの括弧として使用されます。

shまた、は任意の文字と一致するため、の前のドットをエスケープする必要があります。

修正されたコマンドは次のようになります。

find . -regex ".*foo\(\.bar[0-9]\)?\.sh"

ちなみに、エラー 2. は、find-regexスイッチが気に入らない理由です。エスケープが一貫していません。

もちろん動作しますが、grep -PPerl 互換正規表現 (PCRE) を使用するため、機能は増えますが、驚きや落とし穴は少なくなります。

個人的には、以下を使用します:

find . | grep -P "foo(\.bar\d)?\.sh"

関連情報