やりたいこと
以下のような連番ファイルの数字の桁を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 |