Linux の seq コマンドは、シンプルな数列を作ってくれる。例えば、1 から 10 までの数字を表示させるには次のやうにする。
$ seq 10 1 2 3 4 5 6 7 8 9 10
途中の数字から始めたい場合は、その数字を第一引数にとる。5 から 10 までの数字列を得る場合の例は次の通り。
$ seq 5 10 5 6 7 8 9 10
このコマンドを何に使うのかというと、shell script の中で連番ファイルを作成するのに活用する。例えば、こんな感じ。
#!/bin/bash for i in `seq 10`; do echo $i.jpg done
echo コマンドの代わりに、wget を使えば、連番ファイルのダウンロード。touch コマンドを使えば、連番ファイルの作成。etc...
0 padding
さて、10 個以上の連番ファイルを作る場合、0 パディングを加えておくと便利。というのも、ls コマンドは、ファイル名をリスト表示させる時に、(数字じゃなくて) 文字順でファイルを並べるから。実例を見せる方が早い。foo1.jpg から foo10.jpg までのファイルを ls で表示すると、次のやうになる。
$ ls 1.jpg 10.jpg 2.jpg 3.jpg 4.jpg 5.jpg 6.jpg 7.jpg 8.jpg 9.jpg
そこで、数字の前に 0 を加えてやる。
$ ls 01.jpg 02.jpg 03.jpg 04.jpg 05.jpg 06.jpg 07.jpg 08.jpg 09.jpg 10.jpg
すると、上のやうに数字が並ぶ。
-w オプション
0 パディングした数字列を得るには、-w オプションを使う。つまり、上のファイル群を作るは、かうする。
for i in `seq -w 10`; do touch $i.jpg done
ぼくは -w オプションを知らなくって、printf コマンドを使ってた。つまり、こんな感じ。
for i in `seq 10`; do j=`printf "%02d" $i` touch $j.jpg done
何て無駄なことをしてたんだらう!
-f オプション
更に今回、記事を書く為に man コマンドを引いて、-f オプションがあることも知った。-f オプションは、フォーマット文字列を受け付ける。つまり、printf コマンドと同じことができる。例えば、こんな感じに使う。
for f in `seq -f "foo%02g.jpg" 10`; do echo $f touch $f done
seq が内部的に実数を扱ってるってのは、びっくり。
seq は seq 始まりの数 増加分 終わりの数 という書式を取れるので、もしやと小数の増加分を加えたら成功した。
seq -f '%4.2f' 1 0.1 2 1.00 1.10 1.20 1.30 1.40 1.50 1.60 1.70 1.80 1.90
なるほどね。
あとがき
このエントリーは、odz buffer の以下の二つのエントリーに触発されて書いた。
No comments:
Post a Comment