私たちのコードは、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
-
-E
grep
sed