在Linux中查找文件名包含可选字符的文件

8
假设我有两个文件:acabc。我想找到一个正则表达式,可以匹配这两个文件。通常我期望下面的正则表达式可以工作,但事实并不如此:
find ./ -name ab?c

我已经尝试转义或不转义问号,但这似乎从未起作用过。通常在我找到的正则表达式文档中,“?”的意思是:前一个字符重复0次或1次,但“find”似乎不理解这一点。
我已经在两个不同的版本的“find”上尝试过:GNU find version 4.2.31和find(GNU findutils)4.6.0
PS:这可以使用“*”实现,但我特别想匹配只有一个可选字符。
find ./ -name a*c

提供

./ac
./abc
4个回答

11

-name接收到的表达式不是正则表达式,而是通配符表达式。对于您的用例,不能使用(单个)通配符表达式,但是您可以使用正则表达式,并使用-regex来实现:

```html

-name接收到的表达式不是正则表达式,而是通配符表达式。对于您的用例,不能使用(单个)通配符表达式,但是您可以使用正则表达式,并使用-regex来实现:

```
find -regex '.*/ab?c'

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


6

如果要匹配表达式中仅有一个可选字符,可以尝试使用or选项:

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

仅提供abcac名称。

通常情况下,您可以使用orand选项构建相当复杂的查找查询 =)


3

-name选项使用的是glob模式,它与正则表达式不同。对于glob模式,?表示任意单个字符。如果您想要一个可选的字符,您需要使用两个模式:

find ./ -name abc -o -name ac

1
其他答案已经足够提供解决方案,但了解find命令的-regex选项是匹配整个条目的至关重要的。因此,您不能仅进行部分匹配:
-regex 'ab?c'

你必须使用一个或两个点星:

-regex '.*ab?c.*'

如果没有通配符,也可以使用 grep 实现此功能:

ls . | grep 'ab\?c' 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接