在 macOS 终端中使用正则表达式进行查找

在 macOS 终端中使用正则表达式进行查找

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

1_2-300x224.jpg
1_2-600x449.jpg
1_2-600x600.jpg
1_2-768x575.jpg
1_2-802x600.jpg
1_2.jpg

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

但是运行find . -name ".*(\d{2,4}x\d{2,4}).jpg"却没有结果。

我困惑了!

答案1

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

info find.info 'Reference' 'Regular Expressions' 'emacs regular expression'

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

info find.info 'Reference' 'Regular Expressions'

这里:

* findutils-default regular expression syntax::
* emacs regular expression syntax::
* gnu-awk regular expression syntax::
* grep regular expression syntax::
* posix-awk regular expression syntax::
* awk regular expression syntax::
* posix-basic regular expression syntax::
* posix-egrep regular expression syntax::
* egrep regular expression syntax::
* posix-extended regular expression syntax::

GNU 查找

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

find . -regextype posix-extended -regex '.*[0-9]{2,4}x[0-9]{2,4}.jpg'

输出:

./1_2-600x600.jpg
./1_2-802x600.jpg
./1_2-600x449.jpg
./1_2-300x224.jpg
./1_2-768x575.jpg

BSD 查找

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

find -E . -regex '.*[0-9]{2,4}x[0-9]{2,4}\.jpg'

相关内容