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
追加できます)。-H
find
- ファイルパス(この場合は内容
$directory
)に現在のロケールで有効な文字を形成しないバイトシーケンスが含まれている場合にも機能します(有効な文字のみが一致するため、find
'-regex
sは.*
これらのバイトと一致できません)。.
- リストを印刷する代わりに直接使用できます(コマンドの引数として、繰り返し実行など)。
(<0-255>~????*)
0から255までの3桁以下の数字で構成されている10進数の一致、または(<0-255>~0?*)
前にゼロのない数字を使用することもできます。zsh
globは、数値範囲の一致をサポートする数少ないパターン一致APIの1つです。