連番ファイルをコマンド一発で作成する
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. 連番ファイルを作成する
例として、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