bash 확장 글로브-접두사가없는 파일 일치


13

fail2ban 감옥의 파일 이름을 일치 시키려고합니다. 따라서 파일 이름 globbing 만 사용해야합니다 .regexes 또는 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 제외하고 끝나는 모든 파일과 일치하는 glob를 만들려고합니다. db.example.error.log가능합니까?

시도 !(db)*.error.log했지만 여전히 일치 db.example.com.error.log합니다. 나는 !()문자가 일치하지 않는 것 같아서 *파일 이름의 처음부터 일치 시킬 수 있습니다.

참고 : 새 appX로그 파일이 추가 될 때 glob를 확장하고 싶지 않으므로 @()현재 알려진 비 DB 파일 이름 목록과 함께 사용할 수 없습니다 .

(배경 : db.example.com을 제외한 모든 도메인에서 phpMyAdmin URL을 요청하는 사람을 금지하는 필터를 만들고 싶습니다)

답변:


18

확장 된 파일 이름 글 로빙 패턴 ( 쉘 옵션이 활성화 된 bash상태에서 지원됨 )extglobksh93

!(db*).error.log

로 시작하는 것은 무시합니다 db.

보다 구체적으로 :

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

현재 디렉토리에서 정확히 시작하는 이름은 무시합니다 db.example.com.

!(db.example.com)패턴은 "특별한 같은 역할을 *하여 문자열과 일치하지 않습니다" db.example.com.


당신의 패턴,

!(db)*.error.log

로 시작하는 이름은 제외 db하지만 그 뒤에 문자열을 허용 합니다db .

위와 같은 비유로 !(db)"like"처럼 동작 *하지만 정확한 문자열과 일치하지 않으므로 db패턴을 남길 **.error.log 수 있습니다 (첫 번째 *는 "special"임).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.