将 find 与正则表达式结合使用

将 find 与正则表达式结合使用

我尝试了解如何将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 findMac 上的内容,其中写道:

-regex pattern如果文件的整个路径与使用正则表达式的模式匹配,则为 True。要匹配名为 的文件./foo/xyzzy,可以使用正则表达式.*/[xyz]*or .*/foo/.*,但不能使用xyzzyor /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限定符),尽管可能会更慢)。

相关内容