bash extended glob - correspond à des fichiers sans préfixe

13

J'essaie de faire correspondre les noms de fichiers pour une prison fail2ban - j'ai donc besoin d'utiliser uniquement la globalisation des noms de fichiers - pas les regex ou les scripts bash.

Mon /var/log/apache2répertoire contient des fichiers comprenant:

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

J'essaie de créer un glob pour correspondre à tous les fichiers se terminant par .error.log excepté db.example.error.log - est-ce possible?

J'ai essayé !(db)*.error.logmais cela correspond toujours db.example.com.error.log. Je suppose que le !()ne correspond à aucun caractère, ce qui permet de le *faire correspondre depuis le début du nom de fichier.

Remarque: je ne veux pas avoir à étendre le glob lorsque de nouveaux appXfichiers journaux sont ajoutés, donc je ne peux pas utiliser @()avec la liste des noms de fichiers non-db actuellement connus.

(Contexte: je veux créer un filtre interdisant toute personne demandant des URL phpMyAdmin sur n'importe quel domaine à l' exception de db.example.com)

pompier
la source

Réponses:

18

Le modèle de globbing de nom de fichier étendu (pris en charge par bashavec l' extgloboption shell activée, et également par ksh93)

!(db*).error.log

ignorera tout ce qui commence par db.

Pour être plus précis:

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

Cela ignorera tout nom dans le répertoire courant qui commence exactement db.example.com.

Le !(db.example.com)modèle agit comme un "spécial *" qui ne correspondra pas à la chaîne db.example.com.


Votre modèle,

!(db)*.error.log

exclut tout nom commençant par db, mais autorise toute chaîne après cela, ce qui inclut évidemment db.

Par la même analogie que ci-dessus, !(db)agit "comme *" mais ne correspondra pas à la chaîne exacte db, nous laissant pour **.error.log ainsi dire le modèle (le premier *étant "spécial").

Kusalananda
la source