如何正确使用带有正则表达式的查找?

Dan*_*ele 1 find regular-expression

我无法找出带-regex选项的 find 的正确用法:

例如,给出这个例子:

Morcheeba/Big Calm/02 Shoulder Holster.flac
Morcheeba/Big Calm/02. Shoulder Holster.flac
Run Code Online (Sandbox Code Playgroud)

我只想匹配表单中的字符串path/to/file/## filename.ext,没有点。

我试过:

find Morcheeba/ -regextype egrep -iregex ".*[0-9]{2}*[a-z]*flac$"
Run Code Online (Sandbox Code Playgroud)

和一些变化,但我总是得到所有文件,要么没有。

怎么了?

提前致谢。

Sté*_*las 5

请注意,-regex/ -iregex(GNU 扩展名)-path与完整路径上的标准匹配一样,而不仅仅是文件名。

如果你想找到文件,文件的名称(而不是路径)开始用2个十进制数字,用的东西,是不是一个小数位数以下,并在结尾.flac,你可以做可移植性:

find . -name '[0-9][0-9][!0-9]*.[fF][lL][aA][cC]'
Run Code Online (Sandbox Code Playgroud)

请注意,它不会匹配,01.flac因为[!0-9]无法匹配。相反,你可以这样写:

find . -name '[0-9][0-9][!0-9]*' -name '*.[fF][lL][aA][cC]'
Run Code Online (Sandbox Code Playgroud)

那些使用通配符模式,而不是正则表达式。

要使用 GNUfind-iregex,等价物将是:

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

也就是说,我们在开头锚定两位数字,因为我们确保正则表达式的其余部分不跨越 a /