빠른 링크
와일드카드란
한 문자 지정하기 “?”
여러 문자 매칭하기 “*”
대괄호로 문자 범위 매칭하기
소괄호로 교대 매칭하기
“!”와 “^”로 제외하기
인용으로 와일드카드 끄기
와일드카드란
와일드카드(또는 메타문자)는 다른 문자들을 대신해서 사용되는 특수 문자입니다. 카드 게임의 와일드 카드가 다른 카드처럼 쓸 수 있듯, 셸의 와일드카드는 파일명이나 경로에서 여러 항목을 한 번에 지정할 수 있게 합니다.
중요 포인트: 와일드카드 확장은 프로그램이 아닌 셸에서 처리됩니다. 즉 you type a pattern containing wildcards, the shell expands matching filenames and passes the expanded list to the program. 프로그램 자체는 와일드카드를 보지 못합니다.
셸 종류에 따라 지원하는 패턴이 다릅니다. 가장 흔한 기능은 단일 문자 매칭(?)과 다중 문자 매칭(*)입니다. 고급 매칭을 위해 Bash에서는 shopt으로 옵션을 켜야 하고, zsh에서는 setopt으로 확장 글로빙을 활성화합니다.
용어 정리 한 줄:
- 글로빙(globbing): 와일드카드 패턴으로 파일 목록을 만드는 과정.
한 문자 지정하기 “?”
“?”는 정확히 한 문자를 매칭합니다. 예를 들어 확장자가 .pl(Perl)과 .py(Python)가 혼재된 디렉터리에서 이름이 photo_01, photo_02 같은 JPEG 파일 목록을 보려면:
ls photo.0?.jpg
패턴에 맞는 파일이 없으면 빈 출력이나 “no matches found” 같은 오류가 나올 수 있습니다. 먼저 echo로 테스트하면 안전합니다:
echo photo.0?.jpg
여러 문자 매칭하기 “*”
“*”(애스터리스크)는 0개 이상의 문자를 매칭합니다. 가장 흔히 쓰이는 글로브입니다. 현재 디렉터리의 모든 JPEG 파일을 보려면:
ls *.jpg
디렉터리 내부를 지정할 수도 있습니다:
ls photos/*.jpg
한 문자 매칭(?)과 조합도 가능합니다. 예를 들어 .pl과 .py를 모두 매칭하려면:
ls *.p?
문자열 중간의 문자도 매칭할 수 있습니다:
ls *d*
zsh(또는 Bash에서 globstar 옵션 활성화 시)에서는 재귀적으로 하위 디렉터리까지 매칭할 수 있습니다. 홈 디렉터리 하위의 모든 파일을 보려면:
ls ~/
다른 경로명에서도 재귀 검색이 가능합니다:
ls /usr/
/bin
" 연산자를 이용해 /usr 디렉터리의 재귀 목록을 보여주는 화면." class="block w-auto max-w-full h-auto mx-auto py-2 rounded-xl "/>
참고: Bash에서 (globstar)을 사용하려면 아래를 실행하세요:
shopt -s globstar
“**”(세 개의 )는 심볼릭 링크를 통해서도 탐색할 수 있는 설정에 따라 다르게 동작할 수 있습니다. 쉘과 옵션에 따라 동작이 달라지므로 문서를 확인하세요.
Windows의 “.“ 관습과 달리, 리눅스에서는 단순히 “*”만으로 모든 파일을 의미합니다.
파일을 다른 디렉터리로 복사하려면:
cp * /other/directory
중요: rm 같은 파괴적 명령과 와일드카드를 함께 쓸 때는 매우 주의하세요. 실수로 큰 범위를 삭제하면 복구가 어렵습니다. 항상 미리 확인하고, 가능하면 인터랙티브 옵션(-i)이나 백업을 사용하세요.
대괄호로 문자 범위 매칭하기
대괄호 [] 안에 문자들을 나열하면 그 중 하나와 매칭합니다:
[abc]
대시(-)를 사용해 범위를 지정할 수 있습니다:
[a-z]
[A-Z]
[0-9]
조합도 가능합니다:
[a-zA-Z]
[a-zA-Z0-9]
다른 와일드카드와 합쳐 쓰는 경우가 일반적입니다. 예를 들어 .pl과 .py를 매칭하려면:
ls *.p[ly]
앞에서 문자로 시작하는 파일들만 찾고 싶다면:
ls py*
추가로 중괄호 확장(brace expansion)은 쉘에서 값(단어) 목록을 생성합니다. 예를 들어 “cat”과 “dog”를 출력하려면:
echo {cat,dog}
연속된 값도 만들 수 있습니다. 알파벳 a부터 d까지:
echo {a..d}
숫자도 가능합니다:
echo {1..10}
중괄호 확장은 글로빙과는 별개로, 셸이 직접 단어를 생성하는 기능입니다. 생성된 단어가 실제 파일인지의 여부는 나중에 명령이 실행될 때 판단됩니다.
소괄호로 교대 매칭하기
소괄호와 수직 바(|)를 사용하면 “또는“ 조건을 표현할 수 있습니다. 이 기능은 일부 쉘에서는 확장 글로빙(extglob)을 켜야 사용 가능합니다.
예를 들어 Perl과 Python 스크립트를 다시 매칭하려면:
ls *.(pl|py)
또는 정규식 스타일로 그룹을 쓸 수도 있습니다:
.*p(l|y)
extglob에서 특별한 패턴들이 있습니다. 몇 가지 예:
- +(a|b): 하나 또는 그 이상 중 하나
- *(a|b): 0개 이상
- ?(a|b): 0개 또는 1개
- @(a|b): 정확히 하나
Bash에서 이러한 패턴을 사용하려면:
shopt -s extglob
zsh에서는 이미 더 강력한 패턴을 지원하거나 다음을 사용합니다:
setopt EXTENDED_GLOB
제외 매칭 “!”와 “^”
대괄호 안에서 부정은 ! 또는 ^로 표현합니다. 예를 들어 소문자가 아닌 파일명을 찾으려면:
ls [!a-z]
동일한 의미로:
ls [^a-z]
소괄호 기반의 extglob에서도 !을 사용해 특정 그룹을 제외할 수 있습니다:
!(a|b|c)
이 패턴은 a, b, c가 아닌 모든 항목을 의미합니다(쉘과 옵션에 따라 동작이 다를 수 있음).
인용으로 와일드카드 끄기
와일드카드 확장을 원하지 않을 때는 인용으로 끌 수 있습니다. 정규표현식이나 패턴을 그대로 프로그램에 전달하려면 유용합니다.
- 작은따옴표(‘’)는 모든 확장을 끕니다(셸 변수도 포함).
grep '^foo'
- 큰따옴표(“”)는 셸 변수를 확장하지만 와일드카드 확장은 억제합니다.
grep "^$expression"
예시: 변수 안에 패턴이 있고 파일명 와일드카드를 그대로 쓰고 싶다면 상황에 맞게 결합하여 사용하세요.
실전 팁과 안전 수칙
- 항상 먼저 확장 결과를 확인하세요: echo 또는 printf로 확인합니다.
echo *.txt
printf '%s\n' *.txt
- 위험한 명령은 인터랙티브 모드로 실행하세요:
rm -i *.bak
대량 작업 전에 작은 범위로 테스트하세요. 예: cp나 mv도 동일.
경로에 공백이 포함될 수 있다면 항상 따옴표나 null문자 안전 처리(find -print0 등)를 사용하세요.
복잡한 조건이나 깊은 디렉터리 트리 탐색에는 find가 더 안전하고 유연합니다.
find . -type f -name "*.log" -mtime +30 -exec rm -i {} \;
- Bash에서 재귀 글로브를 쓰려면 globstar를 켜세요:
shopt -s globstar
ls **/*.py
- zsh 사용자는 기본적으로 확장된 글로빙을 제공하는 경우가 많습니다. zsh 문서를 참조하세요.
언제 와일드카드가 실패하는가 (반례)
- 쉘 옵션이 비활성화된 경우 extglob, globstar 등의 고급 패턴이 작동하지 않습니다.
- 패턴이 따옴표로 감싸져 있으면 확장이 일어나지 않습니다.
- 빈 결과를 허용하지 않는 쉘 설정(예: zsh의 nomatch)이면 오류가 발생합니다.
- 파일 시스템 권한 문제로 파일을 읽을 수 없는 경우 매칭이 불완전합니다.
- 특수문자를 포함한 파일명(제어문자, 개행 등)은 예기치 않은 동작을 유발할 수 있습니다.
대안 접근법
- find: 조건(수정시간, 소유자, 크기 등)에 따른 정교한 검색과 -exec로 실행을 연결할 때 유리합니다.
- grep(파일 내용 검색): 파일명 패턴이 아닌 내용 기반 검색에는 grep을 사용하세요.
- rsync: 대량 복사/동기화 시 성능과 안전성 측면에서 유리합니다.
- Python/Perl 스크립트: 복잡한 논리를 적용해야 할 때.
결정 흐름(간단 가이드)
다음 다이어그램을 보고 어떤 도구나 패턴을 쓸지 결정하세요.
flowchart TD
A[문제: 파일 집합을 선택해야 함] --> B{조건으로 선택하려는가}
B -->|파일명 패턴만| C[쉘 와일드카드'globbing']
B -->|파일 내용 또는 날짜/소유자 등| D[find 사용]
C --> E{재귀가 필요한가}
E -->|예| F{쉘이 globstar 지원?}
F -->|예| G[** 또는 shopt -s globstar]
F -->|아니오| D
E -->|아니오| H[*, ?, [], {} 사용]
D --> I[find + -exec 또는 xargs]
I --> J[실행 전 테스트: -print 또는 echo]
H --> J
G --> J
운영자/개발자별 체크리스트
관리자(운영자):
- 중요한 시스템 디렉터리에서 * 사용 전 두 번 확인
- 자동화 스크립트에 백업 및 롤백 처리 포함
- crontab에서 glob 사용 시 경로와 환경 변수 검증
개발자:
- 빌드 스크립트에서 확장 결과를 로그로 남기기
- 공백/특수문자 파일을 고려한 처리
- 테스트 환경에서 먼저 실행
초보 사용자:
- 먼저 echo로 결과 확인
- rm 같은 명령은 -i 옵션으로 실행
- 중괄호 확장과 글로빙의 차이를 이해
SOP: 대량 파일 삭제 전 점검 절차
- 삭제할 파일 패턴을 echo로 확인한다.
echo /var/logs/app/*.log
- 파일 목록을 파일로 저장하고 검토한다.
ls -1 /var/logs/app/*.log > /tmp/delete-list.txt
less /tmp/delete-list.txt
- 샘플 파일에 대해 수동 삭제 테스트를 한다.
rm -i /var/logs/app/example.log
- 자동 삭제를 실행할 때는 인터랙티브 또는 시뮬레이션 모드를 사용한다. 가능하면 백업을 생성한다.
# 시뮬레이션: find로 목록만 출력
find /var/logs/app -name "*.log" -print
# 실제 삭제(확인 후)
find /var/logs/app -name "*.log" -mtime +30 -exec rm {} \;
- 작업 후 로그와 결과를 검증한다.
테스트 케이스 / 수용기준
- 단일 문자 매칭: photo.0?.jpg가 photo.01.jpg만 포함하는지 확인
- 다중 문자 매칭: *.txt가 모든 .txt 파일을 포함하는지 확인
- 범위 매칭: [a-c]*가 a~c로 시작하는 파일만 포함하는지 확인
- 제외 매칭: [!0-9]*가 숫자로 시작하지 않는 파일만 포함하는지 확인
- 인용 테스트: ‘*.txt’가 실제로 ‘*’가 포함된 문자 그대로 전달되는지 확인
간단 용어사전 (1줄씩)
- 와일드카드: 파일명이나 경로에서 여러 항목을 지정하는 특수 문자.
- 글로빙: 와일드카드 패턴을 파일 목록으로 확장하는 과정.
- extglob: Bash의 확장 패턴 기능을 켜는 옵션.
- globstar: Bash에서 **로 재귀 검색을 가능하게 하는 옵션.
마무리 요약
와일드카드는 일상적인 파일 작업을 빠르게 만들어 줍니다. 기본은 ?와 *이며, [], {}, ()를 조합해 정교한 패턴을 만들 수 있습니다. 그러나 강력함만큼 위험도 있으니 항상 확장 결과를 확인하고 백업/테스트를 병행하세요.
중요: 실수로 파일을 삭제하거나 덮어쓰지 않도록 항상 echo/ls로 먼저 확인하고, 자동화 스크립트에는 안전장치를 추가하세요.