web-dev-qa-db-ja.com

正規表現は、Linuxの「find」コマンドのいずれかの文字列に一致します

次のいずれかで終わるファイルを再帰的に検索しようとしています.pyまたは.py.server

$ find -name "stub*.py(|\.server)"

ただし、これは機能しません。

私は次のようなバリエーションを試しました:

$ find -name "stub*.(py|py\.server)"

彼らも動作しません。

シンプルな find -name "*.py"は機能しますが、なぜこのregexは機能しないのでしょうか。

20
Reut Sharabani

いう:

find . \( -name "*.py" -o -name "*.py.server" \)

そうすると、ファイル名が*.py*.py.serverに一致します。

man findから:

   expr1 -o expr2
          Or; expr2 is not evaluated if expr1 is true.

編集:正規表現を指定する場合は、-regexオプションを使用します。

find . -type f -regex ".*\.\(py\|py\.server\)"
34
devnull

Findは正規表現パターンを取ることができます:

$ find . -regextype posix-extended -regex '.*[.]py([.]server)?$' -print

オプション:

-正規表現パターン

ファイル名が正規表現パターンと一致します。これは、パス全体での一致であり、検索ではありません。たとえば、./fubar3', you can use the regular expression。* barという名前のファイルに一致させるには 'または.*b.*3', but notf。* r3 '。 findが理解する正規表現はデフォルトではEmacs Regular Expressionsですが、これは-regextypeオプションで変更できます。

-print True;

標準出力に完全なファイル名を出力し、その後に改行を続けます。 findの出力を別のプログラムにパイプしていて、検索しているファイルに改行が含まれる可能性が最も低い場合は、-printの代わりに-print0オプションの使用を真剣に検討する必要があります。ファイル名の異常な文字の処理方法については、「異常なファイル名」セクションを参照してください。

-regextypeタイプ

後でコマンドラインで発生する-regexおよび-iregexテストによって理解される正規表現構文を変更します。現在実装されているタイプはemacs(これがデフォルトです)、posix-awk、posix-basic、posix-egrep、posix-extendedです。

より明確な 説明 またはオプション。 man findまたはinfo findを読むことですべての情報が見つかることを忘れないでください。

6
Chris Seymour

find -nameは正規表現を使用しません。これはUbuntu 12.04のmanページからの抜粋です

-name pattern
              Base of  file  name  (the  path  with  the  leading  directories
              removed)  matches  Shell  pattern  pattern.   The metacharacters
              (`*', `?', and `[]') match a `.' at the start of the  base  name
              (this is a change in findutils-4.2.2; see section STANDARDS CON‐
              FORMANCE below).  To ignore a directory and the files under  it,
              use  -Prune; see an example in the description of -path.  Braces
              are not recognised as being special, despite the fact that  some
              shells  including  Bash  imbue  braces with a special meaning in
              Shell patterns.  The filename matching is performed with the use
              of  the  fnmatch(3)  library function.   Don't forget to enclose
              the pattern in quotes in order to protect it from  expansion  by
              the Shell.

したがって、-nameが取るパターンは、シェルグロブのようなものであり、正規表現のようなものではありません

正規表現で検索したい場合は、次のようにします

find . -type f -print | egrep 'stub(\.py|\.server)'
4
Vorsprung