网上有很多这样的问题,但我无法解决这个简单的问题。
我有一个包含大量图像的目录,但我只想复制其中由数字范围标识的子集。每张图片的格式为:“ [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 {} \;
我正在尝试做的事情的有效表达是什么?
我知道您发布了自己的答案,但如果您希望使用 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例如。我不确定您正在使用哪些文件,但您可能需要缩小正则表达式的范围,因为它对接受的内容相当宽松。
该命令还有一个-or(或) 运算符。您可以将表达式分为两个子表达式:-ofind
find /path/to/images/ -regex ".*(26[2-7]).*" -o -regex ".*(27[0-2]).*" -exec echo {} \;
Run Code Online (Sandbox Code Playgroud)
-o符合 POSIX 标准,但-or不符合:
根据find手册页:
Run Code Online (Sandbox Code Playgroud)expr1 -o expr2 Or; expr2 is not evaluated if expr1 is true. expr1 -or expr2 Same as expr1 -o expr2, but not POSIX compliant.
阅读手册页find提供了一些有用的信息:
find 理解的正则表达式默认是 Emacs 正则表达式。
所以,看看Emacs Regex的语法
似乎所有特殊字符都需要用\. 考虑到这一点,将正则表达式改为如下后,得到了预期的结果:
find /path/to/images/ -regex ".*\(26[2-7]\|27[0-2]\).*" -exec echo {} \;
Run Code Online (Sandbox Code Playgroud)
在发布这个问题之前,我查阅了手册页,但显然不够细致。