Bash Extended Glob - Match-Dateien ohne Präfix

13

Ich versuche, Dateinamen für ein Fail2Ban-Gefängnis abzugleichen. Daher muss ich nur das Globbing von Dateinamen verwenden, keine regulären Ausdrücke oder Bash-Skripte.

Mein /var/log/apache2Verzeichnis enthält Dateien einschließlich:

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

Ich versuche , eine glob zu erstellen , um alle Dateien mit der Endung entsprechen , .error.log außer db.example.error.log - ist das möglich?

Ich habe es versucht, !(db)*.error.logaber das passt immer noch db.example.com.error.log. Ich vermute, das !()stimmt mit keinen Zeichen *überein , so dass die Zeichen ab dem Anfang des Dateinamens übereinstimmen .

Hinweis: Ich möchte den Glob nicht erweitern müssen, wenn neue appXProtokolldateien hinzugefügt werden. Daher kann ich ihn nicht @()mit der Liste der derzeit bekannten Nicht-DB-Dateinamen verwenden.

(Hintergrund: Ich möchte einen Filter erstellen, der alle Personen mit Ausnahme von db.example.com verbietet, die phpMyAdmin-URLs in einer beliebigen Domain anfordern.)

Feuerwehrmann
quelle

Antworten:

18

Das erweiterte Globbing-Muster für Dateinamen (unterstützt von bashbei extglobaktivierter Shell-Option und auch von ksh93)

!(db*).error.log

ignoriert alles, was mit beginnt db.

Um genauer zu sein:

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

Dadurch werden alle Namen im aktuellen Verzeichnis ignoriert, die genau mit "" beginnen db.example.com.

Das !(db.example.com)Muster verhält sich wie ein "spezielles *" Muster , das nicht mit der Zeichenfolge übereinstimmt db.example.com.


Dein Muster,

!(db)*.error.log

Schließt alle Namen aus, die mit "" beginnen db, lässt jedoch alle nachfolgenden Zeichenfolgen zu, einschließlich "" db.

Nach der gleichen Analogie wie oben !(db)verhält es sich "wie *", aber es stimmt nicht mit der exakten Zeichenfolge überein , sozusagendb mit dem Muster (wobei das erste "speziell" ist).**.error.log *

Kusalananda
quelle