Findは同じCWDでregexpを使用しますが、他のディレクトリでは使用しません。

Findは同じCWDでregexpを使用しますが、他のディレクトリでは使用しません。

findコマンドがありますが、任意のディレクトリでコマンドを実行し、ポイントを現在の作業ディレクトリの変数に$directory置き換えたいと思います。.

これはどんな効果がありますか?

  • 実施例1
find $directory -maxdepth 1 -type d -name "test*"

これは私にいくつかの結果を与えます。

これも動作します

  • 実施例2
find . -maxdepth 1 -type d -regextype posix-extended -regex "^./[a-zA-Z0-9]+([-_]?[a-zA-Z0-9]+)*-[0-9]{1,3}(.[0-9]{1,3}){,3}\$"

しかし、aを使用すると$directory機能しません。./最初は正規表現を削除しました。

  • 実施例3
find $directory -maxdepth 1 -type d -regextype posix-extended -regex "^[a-zA-Z0-9]+([-_]?[a-zA-Z0-9]+)*-[0-9]{1,3}(.[0-9]{1,3}){,3}\$"

なぜこれが起こるのですか?

ありがとう

答え1

-regex(非標準)、-pathファイルのフルパスの標準一致と同じです。これらのパスはの内容で始まり、$directoryその後に見つかったディレクトリとファイルが続きますfind。したがって、$directoryこれは正規表現と一致しますが、/some/dir最初の文字はalnumではなくaであるため、ここでは絶対一致しません。-regex/some/dir/file-discovered-by-find/

最初の場合、正規表現は^./(正規表現演算子である^\./か、GNUで示されているように)で始まります。.\./^find-regex$directory.

(…)内のすべての正規表現演算子をエスケープする必要があることを覚えているのと$directory同様のことを行う必要があります。しかし、ここでは次のようにすることもできます。$directory^$*()+[]?.\

find "$directory" -maxdepth 1 -type d -regextype posix-extended \
  -regex '.*/[[:alnum:]]+([-_][[:alnum:]]+)*-[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){0,3}'

.(また、文字だけでなく\.リテラルとも一致させたいと思われ、ここで不要な文字を削除しました。).?

つまり、パターン(ここに含まれていないことが保証されています/)が一致するものの後ではなく、一致するものの後/(およびファイルパスの最後まで(暗黙的に)も)一致するようにします。$$directory

を使用すると、zsh -o extendglob次のことができます。

set -o extendedglob
w=[0-9a-zA-Z] d=[0-9]
print -rC1 -- $directory/$~w##([-_]$~w##)#-$~d(#c1,3)(.$~d(#c1,3))(#c0,3)(#q/)

GNUに比べていくつかの利点がありますfind

  • GNU以外のシステムでも機能します(GNUへの依存関係の削除find)。
  • 初期でも$directory有効-
  • ソートされたリストを提供します
  • inと一致するのはランダムでzshはなく[a-zA-Z0-9]、inのようにロケールごとに変わらず、一致させたいfind文字とのみ一致します。では同等のものを得るfind必要があります。[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]
  • ディレクトリへのシンボリックリンクを使用しても機能します(これにオプションを$directory追加できます)。-Hfind
  • ファイルパス(この場合は内容$directory)に現在のロケールで有効な文字を形成しないバイトシーケンスが含まれている場合にも機能します(有効な文字のみが一致するため、find' -regexsは.*これらのバイトと一致できません)。.
  • リストを印刷する代わりに直接使用できます(コマンドの引数として、繰り返し実行など)。
  • (<0-255>~????*)0から255までの3桁以下の数字で構成されている10進数の一致、または(<0-255>~0?*)前にゼロのない数字を使用することもできます。zshglobは、数値範囲の一致をサポートする数少ないパターン一致APIの1つです。

関連情報