Bash で一括リネームするアイデア

Bash でファイルを一括リネームしたく、やり方を調べていた。

今回リネームしたいファイル群は、

01 hoge.png
02 fuga.png
03 foo.png
04 bar.png

…と、こんな風に「連番 + テキスト」となっている画像ファイルで、「テキスト」部分を除去して連番のみのファイル名に変えたいと考えていた。

で、色々調べていて行き着いたのは、以下のようなやり方。

$ find . -name '*.png' | sed -e 's/\([0-9][0-9]\)\(.*\)/"\1\2" "\1.png"/' | xargs -n 2 mv

やっていることは以下のとおり。

  1. find で元のファイル名を取得する
  2. sed"01 hoge.png" "01.png" という文字列を作る
    • ココがミソ。正規表現の書き方はイマイチでも、とにかく "変更前ファイル名" "変更後ファイル名" という文字列を作れればいい
    • スペースを含むファイルを正しく解釈するよう、ダブルクォートで囲んでいる
  3. xargs-n オプションを使い、引数に2つの値を渡して mv を実行する
    • sed で整形した文字列と組み合わせると mv "01 hoge.png" "01.png" というコマンドになり、リネームができる

というワケ。

xargs を使って引数を2つ渡す、という発想がなかったのと、sed で「変更前」「変更後」を組み立てておいちゃえば良い、という考えに至らず。正規表現は時々に応じて適当に頑張るとして、構造としては分かりやすいと思う。