2つの異なる名前を見つける方法

2つの異なる名前を見つける方法

私たちのコードは、stdout、stdout.qsub、stderr、stderr.fooなどの名前を持つ多数のファイルを生成します。

私がしたい

find <dir> -name (stdout|stderr) -exec ...

そしてstdoutファイルとstderrファイルだけが見つかり、stdout.qsubなどは見つかりません。

だから私はできません -name "std*" 。この場合、-name "std [eo] [ru] [rt]"を実行でき、その検索ではstdeutファイルが見つからないため機能します。

'-name "std[eo][ru][rt]"'よりもきれいな方法がありますか?

答え1

find "$dir" \( -name stdout -o -name stderr \) -exec ...

またはGNUを使用してくださいfind

find "$dir" -regextype posix-extended -regex ".*/(stdout|stderr)" 

-regexパス全体が一致し、より類似しており、正規-path表現は、始まり-nameと終わりに暗黙の部分があるかのように固定されます。さらに、以降はすべてのシーケンスと一致します。^$.*数値、ロケールの文字でパスをデコードできないディレクトリでは、stdout/ファイルは見つかりません。stderr

$dirまた、-述語名で始まるか、正確に一致する場合は失敗することに注意してくださいfind

BSDを使用すると、find次のことができます。

find -E -f "$dir" -- -regex '.*/std(out|err)'

上記は"$dir"オプションに引数として渡されるので、-fで始まる値についてあいまいさも問題もありません。 forまたはなどの拡張正規表現を有効にします。$dir--Egrepsed

関連情報