将“OR”正则表达式运算符与 find 命令结合使用

将“OR”正则表达式运算符与 find 命令结合使用

网上有很多这样的问题,但我无法解决这个简单的问题。

我有一个包含大量图片的目录,但我只想复制其中由数字范围标识的子集。每张图片的格式为:“ [random characters][capture number].BMP

例如:IZ000561.BMP

find我将其与选项结合使用-regex。我想使用的正则表达式很简单:

.*(26[2-7]|27[0-2]).*

例如,如果我想匹配带有 [262-267],[270-272] 标签的图像。但是这种方法失败了。我去了一个在线正则表达式测试人员使用此表达式全部匹配,符合预期。一定是的find正则表达式引擎对这种过滤要求不同的格式。

我使用的完整命令:

find /path/to/images/ -regex ".*(26[2-7]|27[0-2]).*" -exec echo {} \;

对于我想做的事情,什么是有效的表达?

答案1

阅读手册页会find提供一些有用的信息:

find 理解的正则表达式默认是 Emacs 正则表达式。

那么,看一下语法Emacs 正则表达式

在此处输入图片描述

看起来所有特殊字符都需要用 进行转义\。考虑到这一点,将正则表达式改为以下内容后获得了预期的结果:

find /path/to/images/ -regex ".*\(26[2-7]\|27[0-2]\).*" -exec echo {} \;

在发布这个问题之前,我查阅了手册页,但显然不够细致。

答案2

我知道您发布了自己的答案,但如果您希望使用 REGEX 语法,则可以使用此命令更改 REGEX 类型:

-regextype TYPE

因此我相信可以让你发挥作用:

find /path/to/images/ -regextype sed -regex '.*(26[2-7]|27[0-2]).*' -exec echo {} \;

可能会奏效。

另外,请注意,您的正则表达式将匹配任何包含 262-267 或 270-272 的内容。这意味着它将捕获IZ262561.BMP,以及IZ134267.JPG,和ASDNASDNOANFOIAJFOIJDIO000262.EXE。我不确定您正在处理哪些文件,但您可能需要缩小正则表达式的范围,因为它对接受的内容非常宽松。

答案3

该命令还有一个-or(或) 运算符。您可以将表达式分为两个子表达式:-ofind

find /path/to/images/ -regex ".*(26[2-7]).*" -o -regex ".*(27[0-2]).*" -exec echo {} \;

-o符合 POSIX 标准,但-or不符合:

根据find手册页:

   expr1 -o expr2
          Or; expr2 is not evaluated if expr1 is true.

   expr1 -or expr2
          Same as expr1 -o expr2, but not POSIX compliant.

相关内容