网上有很多这样的问题,但我无法解决这个简单的问题。
我有一个包含大量图片的目录,但我只想复制其中由数字范围标识的子集。每张图片的格式为:“ [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
(或) 运算符。您可以将表达式分为两个子表达式:-o
find
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.