bash extended glob - сопоставлять файлы без префикса

13

Я пытаюсь сопоставить имена файлов для 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добавлении новых файлов журналов, поэтому я не могу использовать @()со списком известных в настоящее время имен файлов не-db.

(Справочная информация: я хочу создать фильтр, запрещающий любому, кто запрашивает любые URL-адреса phpMyAdmin в любом домене, кроме db.example.com)

fireartist
источник

Ответы:

18

Шаблон расширенного имени файла (поддерживается 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)действует «как *», но не совпадает с точной строкой db, оставляя нам **.error.log так сказать шаблон (первый из *которых «особенный»).

Кусалананда
источник