web-dev-qa-db-ja.com

bash拡張グロブ-プレフィックスなしのファイルに一致

Fail2ban刑務所のファイル名を一致させようとしているので、正規表現やbashスクリプトではなく、ファイル名のグロビングのみを使用する必要があります。

私の_/var/log/Apache2_ディレクトリには、次のファイルが含まれています。

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

_.error.log_で終わるすべてのファイルに一致するグロブを作成しようとしていますexcept _db.example.error.log_-これは可能ですか?

私は!(db)*.error.logを試しましたが、これは_db.example.com.error.log_とまだ一致します。 !()が文字に一致しないため、ファイル名の先頭から_*_を一致させることができると思います。

注:新しいappXログファイルが追加されたときにグロブを拡張する必要がないので、現在既知の非DBファイル名のリストで@()を使用できません。

(背景:任意のドメインのphpMyAdmin URLをリクエストするユーザーを禁止するフィルターを作成したいexcept db.example.com)

13
fireartist

拡張ファイル名のグロビングパターン(bashシェルオプションをアクティブにしたextglobと、_ksh93_でサポート)

_!(db*).error.log
_

dbで始まるものはすべて無視されます。

もう少し詳しく言うと:

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

これにより、現在のディレクトリにある、_db.example.com_で始まる名前は無視されます。

!(db.example.com)パターンは、文字列_*_と一致しない「特別な_db.example.com_」のように機能します。


あなたのパターン、

_!(db)*.error.log
_

dbで始まる名前は除外しますが、その後にany文字列を許可します。これには明らかにdbが含まれます。

上記と同じように、!(db)は「_*_」のように動作しますが、正確な文字列dbとは一致しないため、パターン_**.error.log_が残ります- いわば(最初の_*_は「特別」です)。

18
Kusalananda