bash Extended glob - จับคู่ไฟล์โดยไม่มีคำนำหน้า


13

ฉันพยายามจับคู่ชื่อไฟล์สำหรับคุก fail2ban ดังนั้นฉันจึงต้องใช้ชื่อไฟล์กลม ๆ เท่านั้น - ไม่ใช่ regexes หรือ bash scripting

/var/log/apache2ไดเรกทอรีของฉันมีไฟล์รวมถึง:

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

ฉันพยายามที่จะสร้าง glob เพื่อให้ตรงกับไฟล์ทั้งหมดที่ลงท้ายด้วย.error.log ยกเว้น db.example.error.log - นี้เป็นไปได้หรือไม่

ฉันได้พยายามแต่ยังคงตรงกับ!(db)*.error.log db.example.com.error.logฉันคาดเดาว่าการ!()จับคู่ไม่มีตัวละครทำให้การ*จับคู่จากจุดเริ่มต้นของชื่อไฟล์

หมายเหตุ: ฉันไม่ต้องการขยาย glob เมื่อเพิ่มappXไฟล์บันทึกใหม่ดังนั้นฉันไม่สามารถใช้@()กับรายการชื่อไฟล์ที่ไม่ใช่ db ที่รู้จักในปัจจุบัน

(พื้นหลัง: ฉันต้องการสร้างตัวกรองห้ามใครก็ตามที่ขอ phpMyAdmin URL ใด ๆ ในโดเมนใด ๆยกเว้น db.example.com)

คำตอบ:


18

ขยายชื่อไฟล์ globbing รูปแบบ (สนับสนุนโดย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แต่ช่วยให้การใด ๆdbสตริงหลังจากนั้นซึ่งเห็นได้ชัดว่ามี

โดยการเปรียบเทียบเช่นเดียวกับข้างต้น!(db)ทำหน้าที่ "ชอบ*" แต่จะไม่ตรงกับสตริงที่แน่นอนdbปล่อยให้เรามีรูปแบบที่**.error.log จะพูด (กับคนแรก*คือ "พิเศษ")

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.