bash extended glob - match file tanpa awalan


13

Saya mencoba mencocokkan nama file untuk jail2ban jail - jadi saya perlu menggunakan hanya nama file globbing - bukan regex atau bash scripting.

Saya /var/log/apache2Direktori berisi file termasuk:

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

Saya mencoba membuat glob untuk mencocokkan semua file yang diakhiri .error.log kecuali db.example.error.log - apakah ini mungkin?

Saya sudah mencoba !(db)*.error.logtetapi ini masih cocokdb.example.com.error.log . Saya menduga !()tidak cocok dengan karakter, memungkinkan *untuk mencocokkan dari awal nama file.

Catatan: Saya tidak ingin harus memperpanjang glob ketika baru appX file log ditambahkan, jadi saya tidak bisa menggunakan @()daftar nama file non-db yang saat ini dikenal.

(Latar belakang: Saya ingin membuat filter yang melarang siapa pun yang meminta URL phpMyAdmin di domain apa pun kecuali db.example.com)

Jawaban:


18

Pola globbing nama file diperpanjang (didukung oleh bashdengan extglobopsi shell diaktifkan, dan juga oleh ksh93)

!(db*).error.log

akan mengabaikan apa pun yang dimulai dengan db.

Untuk lebih spesifik:

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

Ini akan mengabaikan nama apa pun di direktori saat ini yang dimulai dengan tepat db.example.com .

The !(db.example.com)pola bertindak seperti "khusus *" yang tidak akan cocok dengan string db.example.com.


Pola Anda,

!(db)*.error.log

mengecualikan nama apa pun yang dimulai dengan db, tetapi mengizinkan string apa pun setelah itu, yang jelas termasukdb .

Dengan analogi yang sama seperti di atas, !(db)bertindak "seperti *" tetapi tidak akan cocok dengan string yang tepat db, meninggalkan kita dengan pola **.error.log sehingga untuk berbicara (dengan yang pertama *menjadi "istimewa").

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.