我无法弄清楚 find with -regex
option 的正确用法:
例如,给出以下示例:
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 位十进制数字开头,后跟不是十进制数字的内容并以 结尾.flac
,您可以便携式地执行以下操作:
find . -name '[0-9][0-9][!0-9]*.[fF][lL][aA][cC]'
请注意,它不会匹配 on01.flac
因为[!0-9]
在那里无法匹配。相反,你可以这样写:
find . -name '[0-9][0-9][!0-9]*' -name '*.[fF][lL][aA][cC]'
它们使用通配符模式,而不是正则表达式。
要使用 GNUfind
的-iregex
,等价物是:
find . -regextype egrep -iregex '.*/[0-9]{2}[^0-9/][^/]*\.flac'
find . -regextype egrep -iregex '.*/[0-9]{2}([^0-9/][^/]*)?\.flac'
也就是说,我们将两个数字锚定在开头,因为我们确保正则表达式的其余部分不会跨越/
.
答案2
正如 @steeldriver 所建议的,正则表达式.*[0-9]{2}[^.]*\.flac
工作正常。