bash mở rộng tập tin toàn cầu - khớp mà không có tiền tố


13

Tôi đang cố gắng khớp tên tập tin cho một nhà tù fail2ban - vì vậy tôi chỉ cần sử dụng tên tập tin toàn cầu - không phải regexes hoặc bash scripting.

Thư mục của tôi /var/log/apache2chứa các tệp bao gồm:

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

Tôi đang cố gắng tạo một quả địa cầu để khớp với tất cả các tệp kết thúc .error.log ngoại trừ db.example.error.log - điều này có khả thi không?

Tôi đã thử !(db)*.error.lognhưng điều này vẫn phù hợp db.example.com.error.log. Tôi đoán !()là không khớp với các ký tự, cho phép *khớp từ đầu tên tệp.

Lưu ý: Tôi không muốn phải mở rộng toàn cầu khi các appXtệp logfile mới được thêm vào, vì vậy tôi không thể sử dụng @()với danh sách tên tệp không phải là db hiện được biết đến.

(Nền: Tôi muốn tạo bộ lọc cấm bất kỳ ai yêu cầu bất kỳ URL phpMyAdmin nào trên bất kỳ tên miền nào ngoại trừ db.example.com)

Câu trả lời:


18

Các tên tập tin globbing mô hình mở rộng (được hỗ trợ bởi bashcác extglobtùy chọn vỏ kích hoạt, và cũng bởi ksh93)

!(db*).error.log

sẽ bỏ qua bất cứ điều gì bắt đầu với db.

Để cụ thể hơn:

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

Điều này sẽ bỏ qua bất kỳ tên nào trong thư mục hiện tại bắt đầu bằng chính xác db.example.com.

Các !(db.example.com)mô hình hoạt động như một "đặc biệt *" đó sẽ không phù hợp với chuỗi db.example.com.


Mẫu của bạn,

!(db)*.error.log

không bao gồm bất kỳ tên nào bắt đầu bằng db, nhưng cho phép bất kỳ chuỗi nào sau đó, rõ ràng bao gồm db.

Tương tự như trên, !(db)hành động "như *" nhưng sẽ không khớp với chuỗi chính xác db, khiến chúng ta có mô hình **.error.log để nói (với đầu tiên *là "đặc biệt").

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.