중괄호 확장은 문자열을 만들어
echo {a,b,c}.txt # a.txt b.txt c.txt
echo {1..5} # 1 2 3 4 5
echo {01..05} # 01 02 03 04 05
echo {1..10..2} # 1 3 5 7 9
echo {a..e} # a b c d e
mkdir -p project/{src,test,docs}/{2025,2026}중괄호 확장은 파일 시스템을 조회하기 전에 문자열 후보를 만들어. 아직 존재하지 않는 디렉터리 이름도 펼칠 수 있어 디렉터리 뼈대를 만들 때 편해. 조합이 많다면 실행 전에 printf로 최종 인자를 확인해.
하위 디렉터리까지 찾는 재귀 글로브
ls **/*.py # zsh; bash는 shopt -s globstar 필요
ls src/**/*.{ts,tsx} # 중괄호 확장과 결합**는 디렉터리 경계를 넘어 이름을 찾아. 짧은 대화형 탐색에는 편하지만 큰 트리에서는 셸이 많은 경로를 인자로 펼쳐 인자 길이 제한에 닿을 수 있어. 복잡한 조건이나 흐름 처리가 필요하면 find나 fd를 사용해.
zsh 글로브 한정자
ls *(.) # 일반 파일만
ls *(/) # 디렉터리만
ls *(.om) # 일반 파일, 수정 시각 최신순
ls *(.OL[1,5]) # 가장 큰 일반 파일 5개
ls *(.m-1) # 최근 하루 안에 수정된 일반 파일zsh 전용 문법으로 파일 종류, 정렬, 범위를 한 패턴에 표현해. 짧지만 다른 셸로 옮길 스크립트에서는 같은 뜻의 명시적 명령을 쓰는 편이 읽기 쉬워.
bash의 extglob
shopt -s extglob
ls !(*.txt) # .txt가 아닌 항목
ls @(foo|bar).log # foo.log 또는 bar.log
ls *(foo|bar) # foo나 bar가 0회 이상extglob은 zsh의 확장 패턴과 비슷한 선택 표현을 bash에 제공해. 기본으로 꺼져 있으므로 shopt -s extglob을 먼저 실행해야 해.
확장 순서를 머릿속에서 따라가
셸은 중괄호 확장으로 문자열을 만들고, 매개변수·명령·산술 확장과 경로명 확장을 차례로 적용해. 따옴표, 셸 옵션, 현재 디렉터리가 패턴을 펼칠지 그대로 남길지 결정해. 상태를 바꾸는 명령 전에는 printf '<%s>\n' ...로 최종 인자를 출력해 봐.
일치하는 파일이 없을 때의 동작도 달라
bash와 zsh는 일치하지 않은 패턴을 글자 그대로 남기거나 오류로 처리하거나 빈 목록으로 바꾸는 방식이 다르고, 셸 옵션으로 그 동작을 또 바꿀 수 있어. 대상 셸과 옵션에서 직접 시험하고, 변경 작업을 반복하기 전에 빈 결과를 명시적으로 처리해.