linux查找名称中带有可选字符的文件

时间:2018-07-02 12:29:54

标签: regex linux find

假设我有两个文件:acabc。我想找到一个正则表达式来匹配两个文件。通常,我希望以下正则表达式能够正常工作,但它永远不会起作用:

find ./ -name ab?c

我尝试转义或不转义问号,但这似乎行不通。通常在我找到的正则表达式文档中; ?的意思是:先前的字符重复了0或1次,但是find似乎不理解这一点。

我已经在两个不同的查找版本上进行了尝试:GNU查找版本4.2.31和 查找(GNU findutils)4.6.0

PS:这可以与*一起使用,但是我特别想只匹配一个可选字符

find ./ -name a*c

给予

./ac
./abc

4 个答案:

答案 0 :(得分:4)

传递给-name的表达式不是正则表达式,而是全局表达式。 (单个)全局表达式不能用于您的用例,但是您可以使用-regex使用正则表达式:

find -regex '.*/ab?c'

顺便说一句,默认的正则表达式语言是Emacs Style,如此处所述:https://www.emacswiki.org/emacs/RegularExpression。您可以使用-regextype更改正则表达式语言。

答案 1 :(得分:1)

要将表达式与仅一个可选字符匹配,请尝试使用or选项:

touch abc ac abbc
find . -name "a?c" -or -name "ac"

仅给您:abcac的名字。

通常,您可以使用orand选项=)构建非常复杂的查找查询

答案 2 :(得分:1)

find -name选项使用全局模式,与正则表达式不同。对于glob,?表示任何单个字符。如果希望字符为可选字符,则需要使用两种模式:

find ./ -name abc -o -name ac

答案 3 :(得分:0)

其他答案足以解决问题,但了解find的{​​{1}}选项在整个条目中是否匹配是至关重要的。因此,您不能只进行部分匹配:

-regex

您必须使用一两个点星:

-regex 'ab?c'

如果没有通配符,也可以使用-regex '.*ab?c.*'

grep