bash extended glob - corresponde a arquivos sem prefixo

13

Estou tentando corresponder nomes de arquivos para uma prisão fail2ban - portanto, preciso usar apenas globbing de nome de arquivo - não regexes ou scripts do bash.

Meu /var/log/apache2diretório contém arquivos, incluindo:

example.com.error.log
db.example.com.error.log
app1.example.com.error.log
app2.example.com.error.log

Estou tentando criar uma glob para corresponder a todos os arquivos que terminam em .error.log exceto db.example.error.log - isso é possível?

Eu tentei, !(db)*.error.logmas isso ainda corresponde db.example.com.error.log. Eu estou supondo !()que não corresponde a nenhum caractere, permitindo *que ele corresponda desde o início do nome do arquivo.

Nota: Eu não quero ter que estender o glob quando novos appXarquivos de log são adicionados, portanto não posso usar @()a lista de nomes de arquivos não db atualmente conhecidos.

(Histórico: desejo criar um filtro que proíba qualquer pessoa que solicite qualquer URL phpMyAdmin em qualquer domínio, exceto db.example.com)

fireartist
fonte

Respostas:

18

O padrão de globbing de nome de arquivo estendido (suportado por bashcom a extglobopção shell ativada e também por ksh93)

!(db*).error.log

irá ignorar qualquer coisa que comece com db.

Para ser mais específico:

!(db.example.com).error.log

Isso ignorará qualquer nome no diretório atual que comece exatamente db.example.com.

O !(db.example.com)padrão atua como um "especial *" que não corresponderá à string db.example.com.


Seu padrão,

!(db)*.error.log

exclui qualquer nome que comece com db, mas permite qualquer sequência depois disso, o que obviamente inclui db.

Pela mesma analogia acima, !(db)age "como *", mas não corresponde à string exata db, deixando-nos com o padrão, por **.error.log assim dizer (com o primeiro *sendo "especial").

Kusalananda
fonte