我正在尝试查找与特定模式匹配的文件,但是尝试运行以下命令不会返回任何结果,即使存在与该模式匹配的文件。
find . -maxdepth 1 -regextype posix-extended -regex ".*/s_[a-zA-Z]_[a-zA-Z]\.png" -exec echo {} \;
我知道.*/
匹配整个路径但不太明白这到底意味着什么。
它必须匹配的文件例如包括
- 选择蓝色
- 选择红色
- 蓝色
答案1
您的正则表达式的实际问题是它与应该匹配的内容不匹配。分解如下:
.*/
– 任意字符,多次,后跟斜线。这基本上会消耗实际文件名之前的目录列表,因此它会逐字匹配./
(如您的示例所示),但也会匹配./some/other/dir/
,直到最后一个斜线。这是可行的,因为正则表达式默认是“贪婪的”,这意味着它们会尽可能地匹配。本质上,这部分允许您只搜索实际的文件名并从结果中去除路径。
总而言之,
.*/
如果您只关心实际文件名,则需要在正则表达式前面加上。如果您还需要匹配文件路径的某些部分,则不能使用.*/
s_
– 在您的示例中,这很好用[a-zA-Z]
– 这仅消耗一来自此类的角色_
– 后跟下划线[a-zA-Z]
– 再次一特点\.png
– 逐字匹配点和扩展名
因此,您必须将正则表达式更改为:
.*/s_[a-zA-Z]+_[a-zA-Z]+\.png
您必须使用+
,它基本上表示前一个的一个或多个。