それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bashで指定回数ループして綺麗な連番ファイル名を作る/sprintf

bash は for ループで数値の展開ができます。

for i in {0..100};do   echo $i;done;

メッチャカンタン。 seq なにそれ美味しいの?

コレを使い、Bashで連番ファイル名を綺麗にしたいと思った。

まずループ

BASHで10回ループ

for i in {0..100};\
do \
  echo $i;\
done;

指定回数分ループするときは{}(カーリーブレース)で囲むのがミソ。他にもやり方はあるが,コレが覚えやすい。特にRuby使う人に優しい。

作りたいファイル名は0埋め三桁 001-100

accesslog.1.log
..
accesslog.2.log
accesslog.10.log
..
accesslog.100.log

番号順に並ばない。Vistaなら整列するのだけれど、XPはダメ、

試しに、bashコマンドでsprintfをする。できない

他の言語なら簡単にできるんだ

phpなら

<?php
echo $name = sprintf("some_file%03d.txt", 99);#some_file099.txt

perlなら

$name = sprintf("some_file%03d.txt", 99);
print $name

でも、Bashだとコマンドがない。

takuya$ sprintf
bash: sprintf: command not found

どうするか。

printfを展開するしてファイル名にして,からコマンドに渡す.

for i in {0..10};\
  do name=$(printf accesslog.%03d.log $i);\
  echo $name;\
done;
accesslog.000.log
accesslog.001.log
accesslog.002.log
accesslog.003.log
accesslog.004.log
accesslog.005.log
accesslog.006.log
accesslog.007.log
accesslog.008.log
accesslog.009.log
accesslog.010.log

ポイント

  • $(printf( '%03d' $i )) / sprintfの代わり
  • for i in {0..10}; / seq の代わり

2016/06/03

ちょっと追記