bash genişletilmiş glob - öneksiz dosyaları eşleştir


13

Regexes veya bash komut dosyası değil - sadece dosya adı globbing kullanmanız gerekir - bu yüzden fail2ban hapishane için dosya adlarını eşleştirmeye çalışıyorum.

Benim /var/log/apache2dizin dosyaları da dahil olmak içerir:

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

.error.log Dışında biten tüm dosyaları eşleştirmek için bir glob oluşturmaya çalışıyorum db.example.error.log- bu mümkün mü?

Denedim !(db)*.error.logama bu hala aynı db.example.com.error.log. Dosya adının başından eşleşmesine !()izin veren hiçbir karakter *eşleşmediğini tahmin ediyorum .

Not: Yeni appXgünlük dosyaları eklendiğinde glob'u genişletmek istemiyorum , bu yüzden @()şu anda bilinen db olmayan dosya adları listesiyle birlikte kullanamıyorum .

(Arka plan: db.example.com dışında herhangi bir alanda phpMyAdmin URL'si isteyen herkesi yasaklayan bir filtre oluşturmak istiyorum )

Yanıtlar:


18

Genişletilmiş dosya globbing deseni (desteklediği bashile extglobkabuk seçeneği ile aktive edilmiş ve ksh93)

!(db*).error.log

ile başlayan her şeyi görmezden gelir db.

Daha spesifik olmak gerekirse:

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

Bu, geçerli dizinde tam olarak başlayan herhangi bir adı yoksayar db.example.com.

!(db.example.com)Desen, bir "special gibi davranır *dizeyle eşleşen olmaz" db.example.com.


Sizin düzeniniz,

!(db)*.error.log

ile başlayan herhangi bir adı hariç tutar db, ancak bundan sonra dahil olan herhangi bir dizeye izin verir db.

Yukarıdaki ile aynı benzetme ile, !(db)"gibi *" davranır , ancak tam dizeyle eşleşmez ve dbbizi **.error.log konuşacak şekilde bırakır (birincisi *"özel").

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.