执行find命令匹配日志文件时报Invalid preceding regular expression错误如何解决
报错原因
- 正则语法混用了shell通配符和POSIX扩展正则规则:正则中
*是匹配前一个字符0次或多次的量词,你直接将*放在正则开头,没有前置匹配字符,直接触发语法报错。 - 你指定了
posix-extended正则类型,该模式下匹配重复次数的花括号{}不需要加反斜杠转义,额外转义也会导致语法校验失败。 - 正则中
.是匹配任意字符的元字符,你要匹配文件名中字面量的.,需要转义为\.,否则匹配逻辑也不符合预期。 - 额外注意:
find的-regex参数是匹配文件的完整路径,不是只匹配文件名,所以开头需要覆盖路径前缀的匹配规则。
修正后的命令
方法1:保持使用正则匹配
find . -regextype posix-extended -regex '.*\.log\.[0-9]{1,3}$' -exec gzip -9 {} \;
修正点说明:
- 开头加
.*匹配任意前缀路径 - 用
\.匹配字面量的点符号 - 移除花括号的转义符,符合POSIX扩展正则语法
方法2:用-name参数更简单(更适合文件名匹配场景)
find . -name "*.log.[0-9]*" ! -name "*.gz" -exec gzip -9 {} \;
这个写法不需要处理正则语法,额外加了! -name "*.gz"规则,避免误压已经完成压缩的.gz格式日志文件。
内容的提问来源于stack exchange,提问作者aphabeta
相关产品推荐
相关产品推荐

