printfコマンド

既存のファイルに連番をつけてリネームするという目的はexprコマンドを使うことで達成されたので、次のステップに進みます。
というのも、ここまでのスクリプトでは生成される新しいファイルの連番部分が

aaa1、bbb2、ccc3、ddd4、eee5・・・

という具合に、数字が連番で振られていくから(これが当初の目的だったわけですが)。
しかしこれだと困ることも。
それはファイルの数が10以上になった時です。というのも、例えば

aaa1、aaa2・・・aaa9、aaa10、aaa11・・・

のようにファイル名を同一にして連番部分でファイル管理を行うとき(もともとこういうケースを想定している)、生成されたファイルをファイル名でソートすると

aaa1、aaa10、aaa11・・・aaa2・・・

のような並び順になってしまい、ファイルを連番順にソートすることができなくなってしまうのです。

これを回避するためには連番部分を01、02、03、04・・・のように振らなくてはなりません。
手っ取り早くexprコマンドに代入する変数の初期値を

のように定義してみましたが、これは案の定うまくいきませんでした。
当たり前ですが、

aaa01、aaa2、aaa3・・・と出力されてしまったのです。まぁこれは何となく想定してましたけど(笑)
(さらに「i=01」のように数字の頭に0をつけると8進数として処理されてしまうそうです)

そこでまたまたgoogle先生に尋ねたところ、どうやらprintfコマンドを使えば1→01に書式を変更することができるらしいことがわかりました。変数に代入する値を二桁処理するのではなく、普通に数字で代入したそれを二桁表示に変更する、という段取りで処理する(そしてそれをスクリプト内のループ部分の後半で行う)ということですね。

ループ部分のお尻の方に

と書き加えることで、生成されるファイル名をaaa01のようにできるわけです。

ここでprintfは既に触れたように「データを整形して表示する」コマンド。オプションで付けられている%dが10進数扱いのオプション。%の後に付けられている数字は桁数の指定です。

よってこれで%2dで10進数二桁表示で変数iを表示する、という意味になるわけですね。

これを「for filename in `ls $dir`; do」のループの中に(処理の最後の方で)組み込んでおけば、ファイルを読み込み、数字を付与、その数字を二桁表示にして保存、そして数字部分をインクリメントして同じ処理を繰り返すことができるようになるので、最終的に生成されるファイルはaaa01、aaa02、aaa03・・・のように二桁(一桁の時は頭に0をつけた)の連番がついたファイル名として出力されるのです。

これでさらに一歩前進!
自分が最終的に行いたいことが少しずつできてくる、この達成感はなかなかキモチイイ!

boota

いろんなモノに、いろんな意味で、ヲタ。なのかも?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)