ブレース展開(brace expansion)入門 - {1..10} や {a,b,c} で楽にコマンドを書く

ブレース展開(brace expansion)入門 - {1..10} や {a,b,c} で楽にコマンドを書く

この記事でわかること

  • ブレース展開(brace expansion) が何をする機能なのか分かる
  • {1..10}(連番)と {a,b,c}(リスト)の書き方が分かる
  • mkdircp と組み合わせて 同じ作業の繰り返しを 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 行?! {1..5} って何ですか?
ライニー先輩: それが今日のテーマ、ブレース展開 だよ。{ }(波括弧、ブレース)の中身をシェルが展開して、file1.txt file2.txt file3.txt file4.txt file5.txt という 5 個の文字列に化けるんだ。

実際に何が起きているか、echo で確かめてみよう。echo渡された文字列をそのまま表示する コマンドなので、展開の結果を見るのにぴったり。

$ echo file{1..5}.txt
file1.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}.png
image_1.png image_2.png image_3.png

5-2. 複数のブレースを並べる(直積)

ブレースを 2 つ以上並べると、全部の組み合わせ が生成される。

$ echo {A,B}{1,2}
A1 A2 B1 B2
リナ: 2 × 2 で 4 通り全部出てきた!
ライニー先輩: そう、これを「直積」っていうんだ。座席表({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.ymlconfig.yml.bak の 2 つに展開され、cp 元 先 の形になる。

6-3. リネームにも使える

$ mv report.txt{,_old}

report.txtreport.txt_old にリネーム。同じファイル名を 2 回打たなくて済む。

7. ブレース展開と *(ワイルドカード)の違い

結論: ブレース展開は文字列を「生成」する。* は既存ファイルに「マッチ」する。存在しないものを作れるのがブレース展開。

リナ: * も複数のファイルをまとめて扱いますよね。何が違うんですか?
ライニー先輩: 大事な違いがあるんだ。* は今あるファイルを探してマッチする。でも ブレース展開はファイルが存在しなくても文字列を作る。だから「これから作るファイル名」を書けるんだよ。

生成(brace)か、マッチ(glob)か

記法 動き ファイルが無いとき
{1..3}.txt 文字列を 生成 する それでも文字列が作られる
*.txt 既存ファイルに マッチ する 何にもマッチしない

touch file{1..3}.txt(これから作る)は OK。touch file*.txt(まだ無い)は意図通りにならない。

8. よくあるつまずき

結論: スペースの混入・変数の直接利用・ドットの数が定番のミス。$変数 を範囲に使うときは seqeval を検討する。

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 問で、ブレース展開の基本を手で確かめる。

リナ: 手を動かして覚えたいです!
ライニー先輩: いいね、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

次に読む