我尝试了解如何将find
命令与正则表达式一起使用(macOS 14.4.1、Zsh 5.9)。
note-red.png
我有一个目录,其中包含、note-yellow.png
、(和其他颜色)、folder-red.png
、 、(和其他颜色)等文件folder-yellow.png
,但是在该文件夹中执行以下命令时不会显示任何结果。我做错了什么?
find -E . -regex '^(note|folder)'
find -E . -regex '^(note|folder).+'
答案1
RE 的结构不正确。有关详细信息,请参阅man find
Mac 上的内容,其中写道:
-regex pattern
如果文件的整个路径与使用正则表达式的模式匹配,则为 True。要匹配名为 的文件./foo/xyzzy
,可以使用正则表达式.*/[xyz]*
or.*/foo/.*
,但不能使用xyzzy
or/foo/
。
所以你需要使用-regex '.*/(note|folder)-.*'
.
您已经注意到使用启用 ERE 交替的要求-E
(以及分组语法从 更改为\(...\)
)(...)
,所以这很好:
find -E . -regex '.*/(note|folder)-.*'
note-
或者为了更精确的匹配(不匹配恰好以或开头的中间目录名称folder-
),
find -E . -regex '.*/(note|folder)-[^/]*\.png$'
您还可以使用标准-name
测试来匹配这两种模式:
find . \( -name 'note-*.png' -o -name 'folder-*.png' \)
或者既然您正在使用zsh
,请使用其递归 glob 而不是find
:
print -rC1 -- **/(note|folder)-*.png(ND)
(还避免了./
路径上的前缀,并为您提供一个排序列表(您可以使用限定符来避免oN
),并使编写隐藏文件脚本变得更容易(通过删除D
限定符),尽管可能会更慢)。