bash extended glob - abbina i file senza prefisso


13

Sto cercando di abbinare i nomi dei file per una jail fail2ban - quindi ho bisogno di usare solo il nome del file globbing - non regex o script bash.

La mia /var/log/apache2directory contiene file che includono:

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

Sto cercando di creare un glob per abbinare tutti i file che terminano .error.log tranne db.example.error.log : è possibile?

Ci ho provato !(db)*.error.logma questo corrisponde ancora db.example.com.error.log. Immagino !()che non corrisponda a nessun carattere, permettendo *che corrisponda dall'inizio del nome file.

Nota: non voglio estendere il glob quando appXvengono aggiunti nuovi file di log, quindi non posso usare @()con l'elenco dei nomi di file non-db attualmente conosciuti.

(Background: voglio creare un filtro che vieti a chiunque richieda qualsiasi URL phpMyAdmin su qualsiasi dominio tranne db.example.com)

Risposte:


18

Il modello di globbing del nome file esteso (supportato da bashcon l' extglobopzione shell attivata e anche da ksh93)

!(db*).error.log

ignorerà tutto ciò che inizia con db.

Per essere più specifici:

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

Ciò ignorerà qualsiasi nome nella directory corrente che inizia esattamente db.example.com.

Il !(db.example.com)modello si comporta come uno "speciale *" che non corrisponderà alla stringa db.example.com.


Il tuo modello,

!(db)*.error.log

esclude qualsiasi nome che inizia con db, ma consente qualsiasi stringa successiva, che ovviamente include db.

Per la stessa analogia di cui sopra, !(db)agisce "come *" ma non corrisponde alla stringa esatta db, lasciandoci con lo schema per **.error.log così dire (con il primo *essere "speciale").

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.