Bash 大括號擴展 讓命令列操作更簡潔高效,透過 {item1,item2,...} 語法在執行前展開為多個參數。
cp /etc/apt/sources.list{,.bak}
# 展開為:cp /etc/apt/sources.list /etc/apt/sources.list.bak
原理:{,.bak} 中逗號前為空 → 保持原字串;逗號後為 .bak → 附加 .bak。Shell 自動展開為兩個完整參數。
cp /etc/nginx/nginx.conf{,.bak}
mv /var/log/app.log{,.old}
cp -r /home/user/project{,_backup_$(date +%F)}
mkdir -p /var/www/{html,logs,backup}/{dev,staging,prod}
# 一次建立 9 個目錄
touch file_{1..10}.txt
touch {readme,changelog,license,contributing}.md
touch src/{main,test}/{java,resources}/.gitkeep
echo {1..10} # 1 2 3 ... 10
echo {01..10} # 01 02 ... 10 (零填充)
echo {a..z} # a b c ... z
echo {A..Z} # 大寫字母
echo {1..10..2} # 1 3 5 7 9 (步長 2,Bash 4.0+)
echo {A,B}{1,2} # A1 A2 B1 B2
mkdir -p project/{src,test}/{main,resources}/{java,scala}
cp config.ini config.ini.$(date +%F)
# 更簡潔:
cp config.ini{,.{$(date +%F),bak}}
cp /etc/{passwd,group} 正常,但 cp /etc/*.conf{,.bak} 不會先展開萬用字元,需改用迴圈{a, b} 會產生 a 和 b(含前導空格),請勿在逗號後加空格#!/bin/bash# 將 .jpg 批次改為 .jpeg
for f in *.jpg; do mv "$f" "${f%.jpg}.jpeg"; done
# 搭配大括號一次處理多前綴
for p in img_ photo_ pic_; do mv ${p}*.jpg ${p}*.jpeg; done
掌握大括號擴展,命令列操作效率提升 50% 以上,是 Linux 進階用戶必備技能。