kazmax - Linux で自宅サーバー

連番ファイルをコマンド一発で作成する

foo_1.txt, foo_2.txt, ・・・ , foo_100.txt の様な連番ファイルや、A.txt, B.txt, C.txt, ・・・ ,Z.txt の様な連続ファイルをコマンド一発で一括して作成します。

bashの拡張機能(ブレース展開の一部)を利用しているので、ファイル作成だけでなく、ディレクトリ作成や、echoの引数や、for文等にと、コマンド全般に利用できます。

テスト用の環境作成する時とかに知ってると結構便利です。

また、この拡張機能はbash-3.0-alphaから追加されたようなので、それ以前のbashでは利用できません。

Last Update : 2007年08月10日

連番ファイルをコマンド一発で作成する 項目

  1. 連番ファイルを作成する
  2. 連続ファイルを作成する
  3. インクリメント・デクリメントを利用する

1. 連番ファイルを作成する

例として、foo_1.txt ~ foo_30.txt を作成します。

[hoge@localhost ~]$ ls
[hoge@localhost ~]$ touch foo_{1..30}.txt ← 連番ファイル作成
[hoge@localhost ~]$ ls
foo_1.txt   foo_14.txt  foo_19.txt  foo_23.txt  foo_28.txt  foo_5.txt
foo_10.txt  foo_15.txt  foo_2.txt   foo_24.txt  foo_29.txt  foo_6.txt
foo_11.txt  foo_16.txt  foo_20.txt  foo_25.txt  foo_3.txt   foo_7.txt
foo_12.txt  foo_17.txt  foo_21.txt  foo_26.txt  foo_30.txt  foo_8.txt
foo_13.txt  foo_18.txt  foo_22.txt  foo_27.txt  foo_4.txt   foo_9.txt

大切なところは、{x..y}の部分です。

{ } カッコは{ }(←のカッコ)を使います。
x 開始数字
.. ピリオド2つ。
y 終了数字

カッコは{}を使います。
開始数字( x )と終了数字( y )の間は、ピリオドピリオド .. を使います。

{x..y}と書くと、bashでは連続的な表現として扱ってくれるので、 上の例では、連番ファイルが作成される事になります。

この連続的な表現として扱ってくれる機能は、bash のブレース展開という機能に、bash-3.0-alphaから新たに追加された機能の為、 それ以前のbashでは使用できません。

memo

桁をそろえる

[hoge@localhost ~]$ echo {01..10} ← 「0」で頭をうめとくと桁をそろえてくれます
01 02 03 04 05 06 07 08 09 10

[hoge@localhost ~]$ echo {001..10} ← 「0」で頭をうめとくと桁をそろえてくれます
001 002 003 004 005 006 007 008 009 010

2. 連続ファイルを作成する

{x..y}は、数字だけでなく、アルファベットでも使用する事ができます。

例 )
A.txt, B.txt, C.txt, ・・・ Z.txt を作成する

[hoge@localhost ~]$ ls
[hoge@localhost ~]$ touch {A..Z}.txt ← 連続ファイル作成
[hoge@localhost ~]$ ls
A.txt  D.txt  G.txt  J.txt  M.txt  P.txt  S.txt  V.txt  Y.txt
B.txt  E.txt  H.txt  K.txt  N.txt  Q.txt  T.txt  W.txt  Z.txt
C.txt  F.txt  I.txt  L.txt  O.txt  R.txt  U.txt  X.txt

3. インクリメント・デクリメントを利用する

{x..y}での連続的な表現は、常に±1ずつです。
-1ずつもできます。

echo でテストすると以下の様になります。

[hoge@localhost ~]$ echo {1..10}
1 2 3 4 5 6 7 8 9 10 ← 昇順

[hoge@localhost ~]$ echo {10..1}
10 9 8 7 6 5 4 3 2 1 ← 降順

↓アルファベットも
[hoge@localhost ~]$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z ← 昇順

[hoge@localhost ~]$ echo {z..a}
z y x w v u t s r q p o n m l k j i h g f e d c b a ← 降順

これができるとforやwhileでのループのシェル作成も簡単なります。

[hoge@localhost ~]$ for i in {10..1}
> do
> echo $i
> done
10
9
8
7
6
5
4
3
2
1