글로브 (프로그래밍)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
글로브(glob)는 1969년부터 유닉스 시스템에서 사용된 와일드카드 문자 확장 기능에서 유래된 프로그래밍 개념으로, 파일 이름 패턴을 지정하는 데 사용된다. 주로 셸, 프로그래밍 언어, SQL 등에서 파일 또는 문자열을 검색하고 일치시키는 데 활용되며, 와일드카드 문자를 사용하여 다양한 패턴을 표현한다. 일반적인 와일드카드로는 `*`, `?`, `[...]` 등이 있으며, 유닉스 계열 시스템에서는 추가적인 문법을 지원하기도 한다. 글로브는 정규 표현식과 유사한 기능을 제공하지만, 클레이니 스타와 같은 일부 기능을 지원하지 않아 정규 언어의 전체 집합을 표현하지는 못한다.
글로빙은 1969년부터 1975년까지 사용된 유닉스 초기 버전(제1~6판)에서 명령어 인터프리터의 와일드카드 문자 확장을 위해 사용된 `/etc/glob` 프로그램에서 유래되었다.[37] `/etc/glob`는 "글로벌 커맨드(global command)"의 약어이다.[38] 이후 셸과 같은 프로그램에서 사용되는 라이브러리 함수 `glob()`으로 제공되었다.
글로브의 문법에 대해 설명한다.
2. 기원
Glob은 원래 B 프로그래밍 언어로 작성되었다. 이는 고급 프로그래밍 언어로 개발된 최초의 주류 유닉스 소프트웨어였다.[1] 이후 이 기능은 본 쉘과 같은 프로그램에서 사용되는 C 라이브러리 함수인 `glob()`으로 제공되었다. 일반적으로 문자열이 주어진 패턴과 일치하는지 테스트하는 `fnmatch()`라는 함수를 기반으로 정의되며, 이 함수를 사용하는 프로그램은 일련의 문자열(일반적으로 파일 이름)을 반복하여 어떤 문자열이 일치하는지 결정할 수 있다. 두 함수 모두 POSIX의 일부로, 2001년부터 POSIX.1에 정의된 함수와 POSIX.2에 정의된 구문이다.[2][3]
전통적으로 glob은 유닉스 dotfile 형태의 숨겨진 파일과 일치하지 않는다. 숨겨진 파일과 일치시키려면 패턴이 명시적으로 `.`으로 시작해야 한다. 예를 들어 `*`는 모든 보이는 파일과 일치하는 반면, `.*`는 모든 숨겨진 파일과 일치한다.
3. 문법
가장 일반적인 와일드카드 문자는 '*', '?', '[…]'이다.와일드카드 설명 예시 일치하는 예 일치하지 않는 예 *
0개 이상의 문자와 일치 Law*
Law
, Laws
, Lawyer
GrokLaw
, La
, aw
*Law*
Law
, GrokLaw
, Lawyer
La
, aw
?
하나의 문자와 일치 ?at
Cat
, cat
, Bat
, bat
at
[abc]
대괄호 안의 한 문자와 일치 [CB]at
Cat
, Bat
cat
, bat
, CBat
[a-z]
대괄호 안의 범위에 속하는 한 문자와 일치 (로케일에 따라 다름) Letter[0-9]
Letter0
, Letter1
, Letter2
, ..., Letter9
Letters
, Letter
, Letter10
일반적으로 경로 구분자(리눅스/유닉스, MacOS 등에서는 '/', 윈도우에서는 '\')는 일치하지 않는다. Bash와 같은 일부 셸은 사용자가 이를 우회할 수 있는 기능을 가지고 있다.[4]
3. 1. 와일드카드 문자
가장 일반적인 와일드카드로는 '*', '?', '[…]'가 있다.와일드카드 설명 예시 일치하는 예 일치하지 않는 예 *
0개 이상의 문자와 일치 Law*
Law
, Laws
, Lawyer
GrokLaw
, La
, aw
*Law*
Law
, GrokLaw
, Lawyer
La
, aw
?
하나의 문자와 일치 ?at
Cat
, cat
, Bat
, bat
at
[abc]
대괄호 안의 한 문자와 일치 [CB]at
Cat
, Bat
cat
, bat
, CBat
[a-z]
대괄호 안의 범위에 속하는 한 문자와 일치 (로케일에 따라 다름) Letter[0-9]
Letter0
, Letter1
, Letter2
, ..., Letter9
Letters
, Letter
, Letter10
어느 경우든 경로 구분 문자(유닉스에서는 /
, Windows에서는 \
)는 일치하지 않는다.
3. 2. 유닉스 계열 시스템 추가 문법
유닉스 계열 시스템에서 `[…]`은(는) 두 가지 추가적인 의미를 갖는다.
와일드카드 | 설명 | 예시 | 일치 | 불일치 |
---|---|---|---|---|
`[!abc]` | 괄호 안에 주어지지 않은 한 문자와 일치 | `[!C]at` | `Bat`, `bat`, 또는 `cat` | `Cat` |
`[!a-z]` | 괄호 안에 주어진 범위에 속하지 않는 한 문자와 일치 | `Letter[!3-5]` | `Letter1`, `Letter2`, `Letter6`에서 `Letter9`까지, `Letterx` 등 | `Letter3`, `Letter4`, `Letter5` 또는 `Letterxx` |
위 표에서 `[!...]`는 괄호 안에 없는 문자와 일치한다. 예를 들어 `[!C]at`는 `Bat`, `bat`, `cat`와 일치하지만 `Cat`과는 일치하지 않는다. `[!a-z]`는 괄호 안의 범위에 속하지 않는 문자와 일치한다. 예를 들어 `Letter[!3-5]`는 `Letter1`, `Letter2`, `Letter6`부터 `Letter9` 등과 일치한다.[13][14]
3. 3. 기타 확장 구문
유닉스 계열 시스템에서 `[!... ]`는 괄호 안에 주어지지 않은 한 문자와 일치하며, `[!a-z]`와 같이 괄호 안에 주어진 범위에 속하지 않는 한 문자와 일치하는 두 가지 추가적인 의미를 갖는다.[13][14]와일드카드 | 설명 | 예시 | 일치 | 불일치 |
---|---|---|---|---|
`[!abc]` | 괄호 안에 주어지지 않은 한 문자와 일치 | `[!C]at` | `Bat`, `bat`, `cat` | `Cat` |
`[!a-z]` | 괄호 안에 주어진 범위에 속하지 않는 한 문자와 일치 | `Letter[!3-5]` | `Letter1`, `Letter2`, `Letter6`에서 `Letter9`까지, `Letterx` 등 | `Letter3`, `Letter4`, `Letter5` 또는 `Letterxx` |
범위는 미리 정의된 문자 클래스, 악센트 문자에 대한 등가 클래스, 입력하기 어려운 문자에 대한 정렬 기호를 포함할 수도 있다. 이들은 POSIX 정규 표현식의 괄호와 일치하도록 정의되어 있다.[13][14]
유닉스 globbing은 POSIX 전통에 따라 셸에 의해 처리된다. Globbing은 명령줄과 셸 스크립트에서 파일 이름에 제공된다. 셸의 POSIX에서 의무화된 `case` 문은 glob 패턴을 사용하여 패턴 매칭을 제공한다.
일부 셸(C 셸, Bash 등)은 교대 또는 중괄호 확장이라고 하는 추가 구문을 지원한다. glob 구문의 일부가 아니기 때문에 `case`에서는 제공되지 않는다. 이는 globbing 전에 명령줄에서만 확장된다.
Bash 셸은 또한 다음 확장을 지원한다:[5]
- 확장된 globbing(extglob): 괄호 안에 포함된 패턴의 여러 발생을 일치시키기 위해 다른 패턴 매칭 연산자를 사용할 수 있도록 하여, 본질적으로 정규 언어를 설명하기 위한 누락된 클레이니 스타와 교대를 제공한다. `extglob` 셸 옵션을 설정하여 활성화할 수 있다. 이 옵션은 ksh93에서 가져왔다. GNU fnmatch와 glob은 동일한 확장을 가지고 있다.[2]
- globstar: `**`를 자체적으로 이름 구성 요소로 사용하여 숨겨지지 않은 디렉터리의 모든 레이어 수를 재귀적으로 일치시킬 수 있다. 자바스크립트 라이브러리와 파이썬의 glob에서도 지원된다.
3. 4. Windows 및 DOS

DOS를 따르는 Windows 셸은 일반적으로 외부 프로그램에 전달된 인수에 대해 와일드카드 확장을 수행하지 않는다. 셸은 자체 내장 명령에 대한 확장을 사용할 수 있다.
- Windows PowerShell은 위에 언급된 모든 공통 구문을 추가 없이 정의한다.
- COMMAND.COM 및 cmd.exe는 몇 가지 제한 사항이 있는 대부분의 공통 구문을 가지고 있다. `[...]`은 없으며 COMMAND.COM의 경우 `*`는 패턴의 끝에만 나타날 수 있다. 파일 확장자 구분 기호인 점 바로 앞에 있는 경우를 제외하고 패턴 중간에 나타날 수 없다.
Windows 및 DOS 프로그램은 argv 스타일 매개변수 대신 긴 명령줄 문자열을 수신하며 분할, 따옴표 처리 또는 와일드카드 확장을 수행하는 것은 해당 프로그램의 책임이다. 프로그램에서 와일드카드를 설명하는 고정된 방법은 기술적으로 없으며 원하는 대로 자유롭게 수행할 수 있다. 두 가지 일반적인 와일드카드 확장기는 다음과 같다:
- Microsoft C 런타임(msvcrt) 명령줄 확장기는 `?` 및 `*`만 지원한다.[6] ReactOS와 Wine는 핵심 CRT에서 작동하는 함수인 `__getmainargs`의 호환 가능한 오픈 소스 구현을 포함하고 있다.
- Cygwin 및 MSYS `dcrt0.cc` 명령줄 확장기는 인수를 분할한 후 Unix 스타일의 `glob()` 루틴을 내부적으로 사용한다.
인덱싱 서비스를 포함한 대부분의 다른 Windows 부분은 CMD에서 발견되는 MS-DOS 스타일의 와일드카드를 사용한다. 8.3 파일명 시대의 유물인 이 구문은 패턴과 텍스트(파일명)의 점에 특별한 주의를 기울인다. 내부적으로는 `<>"` 세 개의 추가 와일드카드 문자를 사용하여 수행된다. Windows API 측에서 `glob()`에 해당하는 것은 `FindFirstFile`이고 `fnmatch()`는 기본 `RtlIsNameInExpression`에 해당한다.[7] (또 다른 fnmatch 유사체는 `PathMatchSpec`이다.) 두 개의 오픈 소스 msvcrt 확장기는 `FindFirstFile`을 사용하므로 8.3 파일명의 특징도 적용된다.
Windows PowerShell은 위에서 언급한 것과 동일하게 정의된 구문을 모두 탑재하고 있으므로, 기능 추가를 할 필요가 없다.[16]
MS-DOS 및 Windows의 COMMAND.COM과 cmd.exe는 글로브 전개를 수행하지 않으며, 명령줄에 있는 와일드카드 `*` 등은 시작하는 프로그램에 그대로 전달되어 프로그램 측에서 대응하면 그에 맞는 동작을 할 수 있다(있을지도 모른다). 셸의 내부 명령 등에서 해석되는 경우 제한적으로 거의 동일한 구문을 가지지만, 구문이 보기에는 비슷할 뿐, "제한적"인 제한 때문에 완전히 별개의 것이며, `[…]`은 존재하지 않고, 또한 COMMAND.COM의 `*`는 패턴의 끝에만 붙일 수 있다.
4. SQL
SQL의 `LIKE` 연산자는 `?`와 `*`에 해당하는 `%`와 `_`를 사용하지만, `[...]`에 해당하는 기능은 없다.[17]
일반 와일드카드 | SQL 와일드카드 | 설명 |
---|---|---|
`?` | `_` | 임의의 단일 문자와 일치 |
`*` | `%` | 임의의 문자를 0개 이상 포함하여 일치 |
표준 SQL은 `LIKE` 연산자에서 간단한 문자열 일치를 위해 글로브와 유사한 구문을 사용하지만, "글로브"라는 용어는 일반적으로 SQL 커뮤니티에서 사용되지 않는다. 백분율 기호(`%`)는 0개 이상의 문자와 일치하고, 밑줄(`_`)은 정확히 하나의 문자와 일치한다.
많은 SQL 구현은 `LIKE` 연산자를 확장하여 문자 범위(`[...]`), 그 부정 및 정규 표현식의 요소를 통합하여 보다 풍부한 패턴 일치 언어를 허용한다. 예를 들어 Transact-SQL에서는 `[...]` 기능을 제공한다.[17]
5. 정규 표현식과의 비교
글로빙은 정규 표현식에 비해 기능이 제한적이다. 특히 클레이니 스타 구문이 없어 표현식의 앞부분을 여러 번 반복할 수 없다.[8]
와일드카드 | 해당 정규 표현식 |
---|---|
? | . |
* | .* |
글로브는 항상 전체 문자열과 일치하는 반면, 정규 표현식은 부분 문자열과 일치할 수 있다. 예를 들어 글로브에서 `S*.DOC`는 `S.DOC`, `SA.DOC`와 일치하지만, `POST.DOC`나 `SURREY.DOCKS`와는 일치하지 않는다.
5. 1. 정규 표현식으로 구현
모질라 프록시 자동 설정(PAC) 구현은 문자열에 대한 glob 일치 기능을 제공하며, 정규 표현식으로 대체하는 방식을 사용한다. 대괄호 구문은 이러한 예에서 정규 표현식에 의해 처리된다.파이썬의 fnmatch는 패턴을 정규 표현식으로 변환하기 위해 더 정교한 절차를 사용한다.[9] 글로브는 식의 앞부분을 여러 번 반복할 수 있는 클레이니 스타가 없는 등, 정규 표현식과는 다르다.
와일드카드 | 등가의 정규 표현식 |
---|---|
? | . |
* | .* |
글로브는 문자열 전체와의 일치를 시도한다. 예를 들어, `영업실적*.xlsx`는 `영업실적.xlsx`나 `영업실적10월.xlsx`와 일치하지만, `영업실적.xls`나 `2020년도 영업실적.xlsx`, `영업실적.docx`와는 일치하지 않는다.
6. 기타 구현
셸 외에도, glob 패턴은 주로 사용자 입력을 처리하기 위해 다양한 프로그래밍 언어에서 사용된다. 다음은 그 예시이다.
프로그래밍 언어 | 설명 |
---|---|
C# | NuGet을 통해 `Glob` 또는 `DotNet.Glob`과 같은 여러 라이브러리를 사용할 수 있다. |
D | `std.path` 모듈에 `globMatch` 함수가 있다. |
자바스크립트 | npm에서 내부적으로 사용되는 `minimatch`라는 라이브러리와 Babel 및 yarn에서 사용되는, 더 최적화되고 정확하며 안전한 globbing 구현이라고 하는 `micromatch`가 있다. |
Go | `filepath` 패키지에 `Glob` 함수가 있다. |
자바 | glob 패턴에서 작동하는 메서드를 포함하는 `Files` 클래스가 있다. |
Haskell | 메인 모듈 `System.FilePath.Glob`을 가진 `Glob` 패키지를 가지고 있다. 패턴 구문은 Zsh의 하위 집합을 기반으로 하며, 주어진 패턴을 최적화하여 단순한 문자 대 문자 일치보다 빠르게 작동한다. |
Perl | (래리 월의 책 프로그래밍 펄에서 논의된 것처럼) `glob` 함수와 BSD glob 루틴을 모방하는 "Glob" 확장을 모두 가지고 있다. Perl의 꺾쇠 괄호도 glob에 사용할 수 있다. (예: `<*.log>`) |
PHP | `glob` 함수가 있다. |
파이썬 | 표준 라이브러리의 `glob` 모듈과 `fnmatch` 모듈이 있다. `glob` 모듈은 파일 이름에 대한 와일드카드 패턴 일치를 수행하고, `fnmatch` 모듈은 동일한 와일드카드 패턴을 기반으로 문자열을 일치시키거나 목록을 필터링하는 함수를 제공한다.[9] 귀도 반 로섬은 1986년 BSD 유닉스에 `glob` 루틴을 작성하고 기여했다. |
루비 | 파일 이름에 대한 와일드카드 패턴 일치를 수행하는 `Dir` 클래스에 대한 `glob` 메서드가 있다. Rant 및 Rake와 같은 여러 라이브러리는 `FileList` 클래스를 제공하며, 이 클래스는 `glob` 메서드를 갖거나 `FileList.[]` 메서드를 동일하게 사용한다. |
Rust | glob 패턴을 일치시킬 수 있는 여러 라이브러리가 있다.[10] |
SQLite | `GLOB` 함수가 있다. |
Tcl | globbing 기능이 포함되어 있다. |
참조
[1]
간행물
A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986
http://www.cs.dartmo[...]
[2]
문서
fnmatch
Linux
[3]
문서
glob
Linux
[4]
웹사이트
Bash Reference Manual
https://www.gnu.org/[...]
2018-03-15
[5]
웹사이트
Bash globs
https://mywiki.woole[...]
2019-11-25
[6]
웹사이트
Wildcard Expansion
https://docs.microso[...]
2022-02-08
[7]
뉴스
Wildcards in Windows
https://blogs.msdn.m[...]
MSDN Devblog
2019-12-24
[8]
서적
Introduction to Automata Theory, Languages, and Computation
Addison-Wesley
[9]
웹사이트
Lib/fnmatch.py
https://github.com/p[...]
Python
2021-11-10
[10]
웹사이트
"#glob - Lib.rs"
https://lib.rs/keywo[...]
2021-11-12
[11]
웹사이트
First Edition Unix manual 'Miscellaneous' section (PDF)
http://cm.bell-labs.[...]
2011-05-11
[12]
웹사이트
1st Edition UNIX
http://unix-jun72.go[...]
code.google.com
[13]
웹사이트
The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition, 2.13. Pattern Matching Notation
http://pubs.opengrou[...]
2017-07-29
[14]
웹사이트
Linux Programmer's Manual, GLOB(7)
http://man7.org/linu[...]
2017-07-29
[15]
웹사이트
Pattern Matching
https://www.gnu.org/[...]
2017-07-29
[16]
웹사이트
Supporting Wildcard Characters in Cmdlet Parameters
https://msdn.microso[...]
2017-07-29
[17]
웹사이트
LIKE (Transact-SQL)
https://technet.micr[...]
2017-07-29
[18]
뉴스
Advanced Bash-Scripting Guide, Chapter 19.2:Globbing
http://www.faqs.org/[...]
Mendel Cooper
2003
[19]
웹사이트
Wildcard Expansion
http://msdn.microsof[...]
Microsoft Developer Network
2017-07-29
[20]
웹사이트
Expanding Wildcard Arguments
http://msdn.microsof[...]
Microsoft Developer Network
2017-07-29
[21]
웹사이트
Supporting Wildcard Characters in Cmdlet Parameters
http://msdn.microsof[...]
Microsoft Developer Network
2017-07-29
[22]
웹사이트
std.path - D Programming Language - Digital Mars
http://dlang.org/pho[...]
dlang.org
2014-09-08
[23]
웹사이트
isaacs/minimatch
https://github.com/i[...]
2016-08-10
[24]
웹사이트
minimatch
https://www.npmjs.co[...]
2016-08-10
[25]
웹사이트
jonschlinkert/micromatch
https://github.com/j[...]
2017-04-04
[26]
웹사이트
micromatch
https://www.npmjs.co[...]
2017-04-04
[27]
웹사이트
Package filepath - The Go Programming Language
http://golang.org/pk[...]
Golang.org
2011-05-11
[28]
웹사이트
File Operations
http://docs.oracle.c[...]
Oracle
2013-12-16
[29]
웹사이트
Glob-0.7.4:Globbing library
http://hackage.haske[...]
2014-05-07
[30]
웹사이트
File::Glob - Perl extension for BSD glob routine
http://perldoc.perl.[...]
perldoc.perl.org
2011-05-11
[31]
웹사이트
glob - Manual
http://www.php.net/g[...]
PHP
2011-05-11
[32]
웹사이트
10.7. glob — Unix style pathname pattern expansion — Python v2.7.1 documentation
https://docs.python.[...]
Docs.python.org
2011-05-11
[33]
웹사이트
10.8 fnmatch Unix filename pattern matching -- Python v2.7.7 documentation
https://docs.python.[...]
Docs.python.org
2014-06-28
[34]
웹사이트
'Globbing' library routine
http://www.isc.org/s[...]
2011-05-11
[35]
웹사이트
Class:Dir
http://www.ruby-doc.[...]
Ruby-doc.org
2011-05-11
[36]
웹사이트
TCL glob manual page
http://www.tcl.tk/ma[...]
2011-11-16
[37]
웹인용
First Edition Unix manual 'Miscellaneous' section (PDF)
https://web.archive.[...]
null
[38]
인용
1st Edition UNIX
http://unix-jun72.go[...]
code.google.com
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com