如何匹配“find”命令的“-name”选项中的零个或一个字符?

如何匹配“find”命令的“-name”选项中的零个或一个字符?

例如,想要匹配该目录及其子目录中以.ly或结尾的所有文件.ily。到目前为止,find . -name "*.*ly" -print这是我能得到的最接近的,但这可能会找到我不想要的文件名。

答案1

您可以使用该-o选项,它是一个“或”选项。

最简单的版本是

find . -name '*.ly' -o -name '*.ily'

这是有效的,因为-print这是默认操作。

但如果这-print只是一个例子,那么您可能需要将这两个子句组合在一起

find . \( -name '*.ly' -o -name '*.ily' \) -print

答案2

zshglob 有一个**/递归 globbing 运算符和 glob 限定符,因此可以完成大部分find可以做的事情。零或一的东西,又名选修的可以在那里做一些事情(|something)(什么也不做或某物),尽管也有(#cX,Y)类似于正则{X,Y}表达式的任意间隔运算符(需要set -o extendedglob):

print -rC1 -- **/*.(|i)ly(N)

find与给你一个排序列表、跳过隐藏文件(D如果需要的话可以使用限定符)、避免./前缀、使用任意文件名(许多find 实现包括 GNUfind阻塞非有效文本的文件名)相比,这将具有优势在用户的区域设置中),如果您需要的不仅仅是打印文件列表,通常可以更轻松、更安全地处理文件列表。

答案3

-regex另一个解决方案是与find支持它的实现一起使用:

GNUfind:

find -regex '.*\.i?ly'
# or the full command
find . -regextype posix-extended -regex '.*\.i?ly'

BSDfind:

find -E . -regex '.*\.i?ly'

-regex选项与整个路径匹配,并在开始和结束处都锚定,因此您在开始时需要,在结束时.*不需要。$

?是一个扩展正则表达式运算符(如 中grep -E)与前面的原子(此处为 )匹配 0 或 1 个i。它在基本正则表达式中不可用,因此您需要-EBSD 中的find。在 GNU 中find(至少在当前版本中),默认的正则表达式既不是基本的也不是扩展的正则表达式,而是来自某些古老版本的 emacs 的一些正则表达式变体,其中? 支持的。所以-regextype posix-extended在这种情况下这是没有必要的。


不过,后来1\{0,1\}已作为 ERE 的等效项添加到 BRE 中。?

相关内容