![在 macOS 终端中使用正则表达式进行查找](https://linux22.com/image/1555529/%E5%9C%A8%20macOS%20%E7%BB%88%E7%AB%AF%E4%B8%AD%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E8%BF%9B%E8%A1%8C%E6%9F%A5%E6%89%BE.png)
我正在尝试搜索包含不同图像文件名变体的文件夹:
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 提到的,使用-name
glob 进行子字符串匹配时,您需要使用-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'