bash 확장 glob - 접두사 없이 파일 일치

bash 확장 glob - 접두사 없이 파일 일치

나는 Fail2ban 감옥의 파일 이름을 일치시키려고 노력 중입니다. 따라서 정규식이나 bash 스크립트가 아닌 파일 이름 globbing을 사용해야 합니다.

/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사용할 수 없습니다 .@()

(배경: 모든 도메인의 phpMyAdmin URL을 요청하는 것을 금지하는 필터를 만들고 싶습니다.와는 별개로db.example.com)

답변1

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)"like" 동작은 *정확한 string 과 일치하지 않으므로 db패턴이 남습니다.**.error.log 당신은 그렇게 말할 수 있습니다(첫 번째는 *"특별"입니다).

관련 정보