我正在尝试匹配fail2ban监狱的文件名 - 所以我只需要使用文件名通配 - 而不是正则表达式或bash脚本。
我的/var/log/apache2
目录包含的文件包括:
example.com.error.log
db.example.com.error.log
app1.example.com.error.log
app2.example.com.error.log
我正在尝试创建一个 glob 来匹配以以下结尾的所有文件.error.log
除了 db.example.error.log
- 这可能吗?
我已经尝试过了!(db)*.error.log
,但这仍然匹配db.example.com.error.log
。我猜测!()
不匹配任何字符,从而允许*
从文件名的开头进行匹配。
注意:我不想在appX
添加新日志文件时扩展 glob,因此我无法使用@()
当前已知的非数据库文件名列表。
(背景:我想创建一个过滤器,禁止任何人在任何域上请求任何 phpMyAdmin URL除了db.example.com)
答案1
扩展文件名通配模式(由激活的 shell 选项支持bash
,extglob
也由ksh93
)
!(db*).error.log
将忽略任何以 . 开头的内容db
。
更具体:
!(db.example.com).error.log
这将忽略当前目录中以 开头的任何名称db.example.com
。
该模式的作用类似于与字符串不匹配的!(db.example.com)
“特殊”模式。*
db.example.com
你的图案,
!(db)*.error.log
排除任何以 开头的名称db
,但允许任何之后的字符串,显然包括db
.
通过与上面相同的类比,!(db)
行为“like *
”但不会匹配确切的字符串db
,给我们留下模式**.error.log
可以这么说(第一个*
是“特殊”)。