ESLint를 vscode에 적용 시킬려고 dos를 보던 중 globs(glob patterns)라는 개념을 처음 알게 되었다.
해당 개념에 내용을 찾아보고 학습 및 기억을 위해 정리 글을 남긴다.
Globs(glob pattern)는 오래전부터 리눅스 운영체제에서 한 번에 여러 개의 파일을 찾을 때 사용해온 패턴 매칭 기법으로 많은 리눅스 명렁어가 인자로 Glob 패턴을 받는다.
Globs는 리눅스 뿐만 아니라 Shell, Java, Python, Node.js, Go, Ruby, PHP 등
대부분의 프로그래밍 언어에서 지원하며, 특히 운영체제 및 프로그래밍 언어를 가리지 않고 프레임워크나 라이브러리를 설정할 때 광범위 하게 사용하고 있다.
Globs는 주로 설정 내용을 프로젝트 일부에 적용하고 싶을 때 사용되는데, 대표적인 사례로 Git에서의 .gitignore
와 VSCode의 파일 검색 등이 있다.
Globs는 아래와 같은 와일드카드(wildcard, 특수기호/괄호)를 제공하며 이를 통해 특정한 파일들을 선택할 수 있다.
?
?
기호는 문자의 종류와 관계없이 정확히 한 글자만 매칭된다.
ex1) a?
[ O ] ab
, ac
, ad
[ X ] abc
, abab
ex2) data/ma??.txt
[ O ] data/main.txt
, data/math.txt
[ X ] data/map.txt
, data/maple.txt
*
*
기호는 공백(길이가 0인 문자열)을 포함하여 길이와 상관 없이 어떤 문자열과도 부합한다.
ex1) a*
[ O ] a
, ab
, abc
.txt
, abc.mp3
ex2) img/abc.*
(img라는 폴더 안에서 파일 이름이 abc로 동일하며 확장자만 다른 파일들을 찾는 경우)
[ O ] img/abc.jpg
, img/abc.png
, img/abc.gif
**
**
0개 이상의 하위 디렉토리와 매칭, 현재 디렉토리 뿐만 아니라 하위 디렉토리의 파일까지 재귀적으로 탐색한다.
예를 들어, 현재 디렉토리 하위에 존재하는 모든 CSS파일을 찾고 싶다면 **/*.css
라는 패턴을 사용한다. (*.css
패턴은 현제 디렉토리에 있는 css 파일만 찾음)
ex1) logs/**/error.log
[ O ] log/error.log
, log/a/error.log
, log/a/b/error.log
, logs/a/b/c/error.log
...
{}
기호는 중복되는 패턴을 통합 시켜준다.
ex1) **/*.jpg
, **/*.JPG
-> **/*.{jpg, JPG}
ex2) public 폴더에 있는 모든 HTML 파일 (HTML 확장자: htm, html)
-> public/**/*.{htm, html}
[]
기호는 문자 범위로 파일 이름 매칭 가능하게 한다.
ex1) 모음 소문자 포함하는 파일 검색 -> **/*[aeiou]*
-
기호 두 문자 사이에 넣을 시 두 문자 사이 모든 문자가 매칭에 사용된다.
ex2) 대문자로 이름이 사작하는 파일 매칭 -> **/[A-Z]*
!
기호를 []
괄호 맨 앞에 붙이면 그 뒤에 나오는 문자를 매칭에서 제외한다.
ex3) **/[!A-Z]*
-> 대문자로 시작하지 않는 파일들 매칭
?
, *
바로 뒤에 ()
기호 사용하면 와일드카드 매칭 시 어느 정도 선택지 제한 가능
ex1) ?(ab|cd)
-> ab
or cd
or
ex2) *(ab|cd)
-> ab
, abab
, cd
, cdcd
, abcd
, cdab
...
Globs는 정규식(Regex, Regular Expression)과 비슷해보여 혼동하는 경우가 많으나 문법이 미묘하게 틀려서 사용 시 각별히 주의가 필요하다,
예를 들어, 길이와 상관없이 모든 문자열과 매칭 시, Globs에서는 *
이지만, 정규식은 .*
으로 해줘야 된다.
무엇보다 이 두가지 패턴은 용도에 차이가 있다. Globs는 파일 시스템을 검색하는데 특화되어 있는 반면, 정규식은 좀 더 범용적으로 사용할 수 있다.
따라서 정규식이 Globs보다 더 강력한 문자열 매칭을 제공하며 문법도 훨씬 더 복잡하다.
Glob 패턴 ... 특정 파일을 매칭하는데 어느 정도 사용하고 있었던 부분이었지만 정확한 개념 정리가 되지 않았었다. 지나가다가 몇번 본 것 같은데 이 기회에 정리할 수 있어서 괜찮았던 시간이었다
그러나 eslint를 설정하면서 딴길로 많이 샌것 같다... 언능 설정해야겠다...
그리고 정규식도 따로 정리해야겠다.
Reference)
https://eslint.org/docs/latest/use/configure/configuration-files#configuration-based-on-glob-patterns
daleseo.com/glob-patterns/
https://velog.io/@k7120792/Glob-%ED%8C%A8%ED%84%B4%EA%B3%BC-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D