首页 > 解决方案 > Linux find 命令:搜索包含括号的文件名

问题描述

我需要找到文件名如下的文件:

<some regex-matched text> (1).<some regex-matched text>

即我想搜索包含的文件名

我先去了 find . -regex '.* \(1\)\..*'。但是括号被忽略了:.* 1\..*返回匹配的文件。

在我试图找到答案的过程中,我发现这个页面涵盖了 Linux find。在这里,我找到了这句话:

“使用反斜杠后跟括号 '\(', '\)' 进行分组。”

【注:给读者看单反斜杠,如那页所示,我把反斜杠加倍写成上面的单反斜杠!】

我不知道该怎么做,即在这种情况下如何转义普通括号。我想也许将表达式中的反斜杠加倍find可能会起作用,但事实并非如此。

即使我尝试在不使用正则表达式的情况下执行此操作find,该位置的括号和/或点似乎也存在一些问题:

mike@M17A .../accounts $  find . -name *(1).pdf
[... finds stuff OK]
mike@M17A .../accounts $  find . -name *(1).*
find: paths must precede expression: ..
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec|time] [path...] [expression]
mike@M17A .../accounts $  find . -name *(1)\.*
find: paths must precede expression: ..
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec|time] [path...] [expression]

NB 在这些尝试中在初始 * 之后放置一个空格也失败了......

标签: regexlinuxfindparenthesesbrackets

解决方案


那是因为您不需要转义这些括号。这应该工作:

find . -regex '.* (1)\(\..*\)?'

尽管使用了捕获组(转义括号)\(\..*\),但我们可以使最后一个匹配项成为可选的(可能后跟一个点,后跟更多文本?


推荐阅读