ブレース展開(brace expansion)入門 - {1..10} や {a,b,c} で楽にコマンドを書く
この記事でわかること
- ブレース展開(brace expansion) が何をする機能なのか分かる
{1..10}(連番)と{a,b,c}(リスト)の書き方が分かるmkdirやcpと組み合わせて 同じ作業の繰り返しを 1 行に短縮 できる- ブレース展開と
*(ワイルドカード)の 決定的な違い が分かる
結論(先に覚えるべき型)
- 連番がほしい →
{1..10} - 決まった単語を並べたい →
{a,b,c} - バックアップを作る →
cp file.txt{,.bak}
1. ブレース展開って何?
結論: ブレース展開は
{ }の中身を展開して複数の文字列を一気に生成する、bash の機能。
file1.txt から file5.txt まで作りたいんですけど、touch file1.txt を 5 回打つしかないですか?touch file{1..5}.txt{1..5} って何ですか?{ }(波括弧、ブレース)の中身をシェルが展開して、file1.txt file2.txt file3.txt file4.txt file5.txt という 5 個の文字列に化けるんだ。実際に何が起きているか、echo で確かめてみよう。echo は 渡された文字列をそのまま表示する コマンドなので、展開の結果を見るのにぴったり。
$ echo file{1..5}.txtfile1.txt file2.txt file3.txt file4.txt file5.txt
ブレース展開の正体
{ } の中身を、シェルが コマンドを実行する前に 複数の文字列へ展開する。
だから touch file{1..5}.txt は、実際には touch file1.txt file2.txt file3.txt file4.txt file5.txt を実行しているのと同じ。
2. 連番を作る:{開始..終了}
結論:
{1..10}は 1 から 10 の連番を生成する。アルファベットや降順、逆順も同じ書き方でできる。
2-1. 数字の連番
$ echo {1..10}1 2 3 4 5 6 7 8 9 10
..(ドット 2 つ)が「ここからここまで」って意味なんですね。{開始..終了} で連番。カンマじゃなくて ドット 2 つ なのがポイントだよ。2-2. アルファベットの連番
$ echo {a..e}a b c d e
2-3. 降順もできる
開始より終了を小さくすれば、逆順に並ぶ。
$ echo {5..1}5 4 3 2 1
3. ゼロ埋めと飛ばし
結論:
{01..10}でゼロ埋め、{1..10..2}で増分(ステップ)を指定できる。
3-1. ゼロ埋め(桁をそろえる)
ファイル名の桁をそろえたいとき、開始の数字を 0 始まりにするとゼロ埋めになる。
$ echo {01..10}01 02 03 04 05 06 07 08 09 10
ゼロ埋めはファイルの並び順を安定させるのに重要。file1 file2 ... file10 は名前順だと file1, file10, file2... の順になってしまうが、file01 file02 ... file10 なら見た目どおりに並ぶ。
3-2. 増分(ステップ)を指定する
{開始..終了..増分} で、いくつ飛ばしにするか指定できる。
$ echo {0..20..5}0 5 10 15 20
$ echo {1..10..2}1 3 5 7 9
4. リストを作る:{a,b,c}
結論:
{a,b,c}はカンマ区切りの単語をそのまま並べる。連番にならない単語を列挙したいときに使う。
連番ではなく、決まった単語を並べたい ときはカンマ区切りを使う。
$ echo {apple,banana,cherry}apple banana cherry
カンマの前後にスペースを入れない
{a, b, c} のようにスペースを入れると、ブレース展開として認識されず、そのまま文字として扱われる。{a,b,c} と 詰めて書く こと。
.. が連番で、, がリスト。使い分けは分かりました!{1..100} を {1,2,3,...,100} と全部書くのは大変だから連番、決まった数語を並べるならリスト、と覚えておくといいよ。5. 前後にくっつける・組み合わせる
結論: ブレースの前後に文字を付けると各要素に配られる。複数のブレースを並べると全組み合わせが生成される。
5-1. 接頭辞・接尾辞(prefix / suffix)
ブレースの前後に文字を付けると、その文字が 各要素すべてに配られる。
$ echo image_{1..3}.pngimage_1.png image_2.png image_3.png
5-2. 複数のブレースを並べる(直積)
ブレースを 2 つ以上並べると、全部の組み合わせ が生成される。
$ echo {A,B}{1,2}A1 A2 B1 B2
{A,B,C}{1,2,3,4})みたいに、行 × 列の組み合わせを一気に作りたいときに便利だよ。6. 実務で効くテクニック
結論: ディレクトリ一括作成・バックアップ作成・リネームは、ブレース展開で 1 行に短縮できる定番パターン。
6-1. ディレクトリをまとめて作る
$ mkdir -p project/{src,test,docs}project の下に src test docs を一度に作れる。-p は「親ディレクトリがなければ一緒に作る」オプション。
6-2. バックアップを一瞬で作る
ブレースの片方を 空 にできる。{,.bak} は「何も付けない」と「.bak を付ける」の 2 つを生成する。
$ cp config.yml{,.bak}cp config.yml{,.bak} の中身
これは次のコマンドと同じ。
$ cp config.yml config.yml.bak
{,.bak} が config.yml と config.yml.bak の 2 つに展開され、cp 元 先 の形になる。
6-3. リネームにも使える
$ mv report.txt{,_old}report.txt を report.txt_old にリネーム。同じファイル名を 2 回打たなくて済む。
7. ブレース展開と *(ワイルドカード)の違い
結論: ブレース展開は文字列を「生成」する。
*は既存ファイルに「マッチ」する。存在しないものを作れるのがブレース展開。
* も複数のファイルをまとめて扱いますよね。何が違うんですか?* は今あるファイルを探してマッチする。でも ブレース展開はファイルが存在しなくても文字列を作る。だから「これから作るファイル名」を書けるんだよ。生成(brace)か、マッチ(glob)か
| 記法 | 動き | ファイルが無いとき |
|---|---|---|
{1..3}.txt |
文字列を 生成 する | それでも文字列が作られる |
*.txt |
既存ファイルに マッチ する | 何にもマッチしない |
touch file{1..3}.txt(これから作る)は OK。touch file*.txt(まだ無い)は意図通りにならない。
8. よくあるつまずき
結論: スペースの混入・変数の直接利用・ドットの数が定番のミス。
$変数を範囲に使うときはseqかevalを検討する。
8-1. 中にスペースを入れてしまう
$ echo { 1..3 }{ 1..3 }
スペースが入るとブレース展開と認識されず、そのまま表示される。{1..3} と詰めて書く。
8-2. 変数をそのまま範囲に使えない
$ n=5
$ echo {1..$n}{1..5}
ブレース展開は 変数展開より先 に行われるため、{1..$n} の $n はまだ数字になっていない。変数で範囲を回したいときは seq を使う。
$ echo $(seq 1 $n)
1 2 3 4 5
8-3. ドットが 1 つだと連番にならない
{1.5} のようにドットが 1 つだと連番にならない。連番は 必ずドット 2 つ({1..5})。
9. ミニ課題:実際にやってみよう
結論: 連番ファイル作成・ディレクトリ一括作成・バックアップの 3 問で、ブレース展開の基本を手で確かめる。
echo を付けて結果を確認してから実行するのがおすすめ。課題1: day01.log から day07.log まで、7 個のログファイルを一度に作ろう。
ヒントを見る
ゼロ埋めの連番 {01..07} と touch を組み合わせる。
解答例
$ touch day{01..07}.log課題2: myapp ディレクトリの下に bin lib conf log の 4 つを一度に作ろう。
ヒントを見る
リスト {bin,lib,conf,log} と mkdir -p を使う。
解答例
$ mkdir -p myapp/{bin,lib,conf,log}課題3: notes.md のバックアップ notes.md.bak を 1 つのコマンドで作ろう。
ヒントを見る
片方を空にしたブレース {,.bak} を使う。
解答例
$ cp notes.md{,.bak}10. コピペ用テンプレート
結論: 連番・リスト・組み合わせ・バックアップのよく使う型をまとめて手元に置いておく。
よく使う型をまとめておく
# 連番ファイルを作る
touch file{1..10}.txt
# ゼロ埋めの連番
touch log{01..12}.txt
# 飛ばし(2 ずつ)
echo {0..100..10}
# 決まった単語のリスト
mkdir -p project/{src,test,docs}
# 全組み合わせ(直積)
echo {2025,2026}-{01..12}
# バックアップを作る
cp config.yml{,.bak}
# 安全確認:echo を付けて結果を見てから実行
echo touch file{1..10}.txt