bash Extended glob - dopasuj pliki bez prefiksu

13

Próbuję dopasować nazwy plików dla więzienia fail2ban - więc muszę używać tylko globowania nazw plików - nie wyrażeń regularnych ani skryptów bash.

Mój /var/log/apache2katalog zawiera pliki, w tym:

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

Próbuję utworzyć glob, aby pasował do wszystkich plików kończących się na, .error.log z wyjątkiem db.example.error.log - czy to możliwe?

Próbowałem, !(db)*.error.logale to nadal pasuje db.example.com.error.log. Zgaduję, że !()nie pasuje do żadnych znaków, co pozwala na *dopasowanie od początku nazwy pliku.

Uwaga: Nie chcę rozszerzać globu, gdy appXdodawane są nowe pliki dziennika, więc nie mogę używać @()z listą obecnie znanych nazw plików innych niż db.

(Tło: Chcę utworzyć filtr zabraniający wszystkim domagania się adresów URL phpMyAdmin w dowolnej domenie z wyjątkiem db.example.com)

strażak
źródło

Odpowiedzi:

18

Rozszerzony wzorzec globowania nazw plików (obsługiwany przez bashz extglobwłączoną opcją powłoki, a także przez ksh93)

!(db*).error.log

zignoruje wszystko, co zaczyna się od db.

Być bardziej specyficznym:

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

To zignoruje każdą nazwę w bieżącym katalogu, która zaczyna się dokładnie db.example.com.

!(db.example.com)Wzór działa jak „Special *”, który nie będzie odpowiadał łańcuch db.example.com.


Twój wzór,

!(db)*.error.log

wyklucza dowolną nazwę zaczynającą się od db, ale dopuszcza dowolny ciąg po niej, co oczywiście obejmuje db.

Zgodnie z tą samą analogią, jak powyżej, !(db)działa „jak *”, ale nie pasuje do dokładnego ciągu db, pozostawiając nam wzór, że **.error.log tak powiem (z tym, *że pierwszy jest „specjalny”).

Kusalananda
źródło