bash extended glob - arquivos de correspondência sem prefixo

11

Eu estou tentando combinar nomes de arquivos para uma cadeia fail2ban - então eu preciso usar somente globbing de nomes de arquivos - não regexes ou bash scripting.

Meu diretório /var/log/apache2 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 um glob para corresponder a todos os arquivos que terminam em .error.log exceto db.example.error.log - isso é possível?

Já experimentei !(db)*.error.log , mas ainda corresponde a db.example.com.error.log . Eu estou supondo que o !() está correspondendo sem caracteres, permitindo que o * para corresponder desde o início do nome do arquivo.

Nota: Eu não quero ter que estender o glob quando novos appX logfiles são adicionados, então eu não posso usar @() com a lista de nomes de arquivos não-db atualmente conhecidos.

(Antecedentes: Eu quero criar um filtro proibindo qualquer um que solicite URLs do phpMyAdmin em qualquer domínio exceto db.example.com)

    
por fireartist 23.02.2018 / 12:28

1 resposta

16

O padrão de globbing de nome de arquivo estendido (suportado por bash com a opção extglob 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 irá ignorar qualquer nome no diretório atual que comece exatamente com db.example.com .

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

Seu padrão,

!(db)*.error.log

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

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

    
por 23.02.2018 / 12:40