bash 扩展 glob - 匹配没有前缀的文件

bash 扩展 glob - 匹配没有前缀的文件

我正在尝试匹配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 选项支持bashextglob也由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 可以这么说(第一个*是“特殊”)。

相关内容