正規表現で find を正しく使用するにはどうすればいいですか?

正規表現で find を正しく使用するにはどうすればいいですか?

オプション付きの find の正しい使い方がわかりません-regex:

たとえば、次の例を考えてみましょう。

Morcheeba/Big Calm/02 Shoulder Holster.flac
Morcheeba/Big Calm/02. Shoulder Holster.flac

path/to/file/## filename.extドットなしの形式の文字列のみを一致させたいです。

私が試したのは:

find Morcheeba/ -regextype egrep -iregex ".*[0-9]{2}*[a-z]*flac$"

多少のばらつきはありますが、常にすべてのファイルを取得するか、まったく取得しません。

どうしたの?

前もって感謝します。

答え1

-regex/ -iregex(GNU 拡張) は、標準と同様に-path、ファイル名だけでなく完全なパスに一致することに注意してください。

ファイルを検索したい場合は、名前(とは対照的にパス) が 2 桁の 10 進数で始まり、その後に 10 進数ではない数字が続き、 で終わる場合.flac、次のように移植可能です。

find . -name '[0-9][0-9][!0-9]*.[fF][lL][aA][cC]'

01.flacでは一致できないため、一致しないことに注意してください[!0-9]。代わりに、次のように記述できます。

find . -name '[0-9][0-9][!0-9]*' -name '*.[fF][lL][aA][cC]'

これらは正規表現ではなくワイルドカードパターンを使用します。

findGNUの を使用する場合-iregex、同等のものは次のようになります。

find . -regextype egrep -iregex '.*/[0-9]{2}[^0-9/][^/]*\.flac'
find . -regextype egrep -iregex '.*/[0-9]{2}([^0-9/][^/]*)?\.flac'

つまり、正規表現の残りの部分が にまたがらないように、先頭の 2 つの数字を固定します/

答え2

@steeldriver の提案どおり、正規表現は.*[0-9]{2}[^.]*\.flac正常に機能しました。

関連情報