在 macOS 终端中使用 find 和正则表达式

min*_*ick 6 terminal regex find macos

我正在尝试搜索包含不同图像文件名变体的文件夹:

1_2-300x224.jpg
1_2-600x449.jpg
1_2-600x600.jpg
1_2-768x575.jpg
1_2-802x600.jpg
1_2.jpg
Run Code Online (Sandbox Code Playgroud)

计划是查找并删除以 2-4 位数字 + 'x' + 2-4 位数字结尾的文件。我可以使用表达式在Regexr.*(\d{2,4}x\d{2,4}).jpg上创建此匹配(此表达式突出显示除 之外的所有内容1_2.jpg)。

但是,运行find . -name ".*(\d{2,4}x\d{2,4}).jpg"不会返回任何结果。

我很困惑!

Tho*_*hor 8

这里有几个问题。首先,正如 John 提到的,-name使用 glob 进行子字符串匹配,您需要使用-regex,其次,存在正则表达式方言不兼容。默认情况下,GNU find 使用 Emacs 正则表达式,BSD find 使用 posix-basic 正则表达式。如果您已find.info安装,可以在此处阅读有关它的更多信息:

info find.info 'Reference' 'Regular Expressions' 'emacs regular expression'
Run Code Online (Sandbox Code Playgroud)

可以在此处找到支持的正则表达式方言:

info find.info 'Reference' 'Regular Expressions'
Run Code Online (Sandbox Code Playgroud)

这里:

info find.info 'Reference' 'Regular Expressions' 'emacs regular expression'
Run Code Online (Sandbox Code Playgroud)

GNU 查找

您可以使用 GNU find 使您的表达式像这样工作posix-extended

find . -regextype posix-extended -regex '.*[0-9]{2,4}x[0-9]{2,4}.jpg'
Run Code Online (Sandbox Code Playgroud)

输出:

info find.info 'Reference' 'Regular Expressions'
Run Code Online (Sandbox Code Playgroud)

BSD 查找

我无法访问 BSD find,但我认为这应该可行:

find -E . -regex '.*[0-9]{2,4}x[0-9]{2,4}\.jpg'
Run Code Online (Sandbox Code Playgroud)

  • 最终的正则表达式在文字点之前缺少反斜杠,并且在正则表达式末尾缺少结束引号。我的 High Sierra MacOS(基本上是 BSD)不喜欢“-E”选项之前的“.”,但颠倒它们的顺序可以解决这个问题。 (2认同)