連番ファイルの数字の桁をrenameで合わせる

やりたいこと

以下のような連番ファイルの数字の桁をLinuxのrenameコマンドで合わせる。

Before

After

Command

1
rename 's/(\d+)/sprintf("%03d", $1)/e' *.txt

最初は-n(No action)オプションを付けて実行してください。
-nオプションを付けると、実際にファイル名を変更すること無く、変換内容を事前確認できます。

コマンド解説

コマンドの中身を簡単に確認しておきます。
基本的にはs/(\d+)/sprintf("%03d", $1)/eの部分が全てです。

s

これはsedやVimでもよく使うので説明は必要ないと思いますが、置換(Substition)を意味します。

(\d+)

一般的な正規表現です。\dは数字一般(0~9)を表します。+は直前の文字が1つ以上連続することを表します。
したがって\d+は1桁以上の数字です。()で囲うことを忘れないでください。

sprintf("%03d", $1)

"%03d"はC言語でもお馴染みの記法なので解説不要と思います。
2つめの引数である$1ですが、ここに先ほど()で囲った部分が格納されます。

e

上記のような式(Expression)を用いる際に指定します。

応用編

以下の場合も見てみると、より理解しやすいと思います。

1
touch {1..10}_{1..10}.txt  # Create empty files

これは以下で桁を揃えることが出来ます。

1
rename -n 's/(\d+)_(\d+)/sprintf("%03d_%03d", $1, $2)/e' *.txt

Reference