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
やっていることは以下のとおり。
find
で元のファイル名を取得するsed
で"01 hoge.png" "01.png"
という文字列を作る- ココがミソ。正規表現の書き方はイマイチでも、とにかく
"変更前ファイル名" "変更後ファイル名"
という文字列を作れればいい - スペースを含むファイルを正しく解釈するよう、ダブルクォートで囲んでいる
- ココがミソ。正規表現の書き方はイマイチでも、とにかく
xargs
の-n
オプションを使い、引数に2つの値を渡してmv
を実行するsed
で整形した文字列と組み合わせるとmv "01 hoge.png" "01.png"
というコマンドになり、リネームができる
というワケ。
xargs
を使って引数を2つ渡す、という発想がなかったのと、sed
で「変更前」「変更後」を組み立てておいちゃえば良い、という考えに至らず。正規表現は時々に応じて適当に頑張るとして、構造としては分かりやすいと思う。