2014-08-02

mvにサヨナラ!renameコマンドのイケメンぶりが半端ない




なんですかこのイケメンコマンドは

ファイル名の変更、ファイルの移動と言えば mvコマンドだ。初歩の初歩だ。
複雑なリネームはパイプやシェルスクリプトで実現するものだという思い込みから、
renameというイケメンコマンドを知らずにいた!なんてもったいない!



とても簡単、そしてステキすぎる実行結果

$ ls
file01.txt
file02.txt
file03.txt
file04.txt
file05.txt

$ rename 's/.txt/.csv/' *.txt

$ ls
file01.csv
file02.csv
file03.csv
file04.csv
file05.csv

これだけで、すべての .txtファイルの拡張子変更ができてしまった!

見ての通りrenameコマンドは、複数ファイルを一括でリネーム、移動するときに力を発揮する。
コマンドの記法は、以下の通り。

rename {正規表現} {処理対象}

処理対象のファイル、ディレクトリをどのようにリネーム(または移動)するかを、
perl正規表現で指定できる。説明不要の簡単さだ。

難しいこと抜きで今日からすぐに使える。

これはリネームの例だが、もちろん他のディレクトリへ移動させることもできる。

$ ls some/sub/dir/
file01.csv
file02.csv
file03.csv
file04.csv
file05.csv

# some/sub/dir/以下の.csvファイルをカレントディレクトリに移動する。
$ rename 's/\//_/g' some/sub/dir/*.csv

# 移動するとき、元のディレクトリ階層をファイル名にくっつけておいた。
$ ls
some/
some_sub_dir_file01.csv
some_sub_dir_file02.csv
some_sub_dir_file03.csv
some_sub_dir_file04.csv
some_sub_dir_file05.csv
これをmvでやろうとおもったらなかなか大変だ。



おさえるべきオプションはたった1つ


それは、-n オプションだ。

rsyncの--dry-run (-n)と同じで、
もし実行したらどのようなリネームが行われるかを表示して、実際には実行しない。
renameは一括でリネーム・移動を行うコマンドのため、
事故らないように -n で一旦確認するクセをつけておくといい。

$ ls
kuso.txt
miso.txt
unko.txt

$ rename -n 's/$/.bak/' *
kuso.txt renamed as kuso.txt.bak
miso.txt renamed as miso.txt.bak
unko.txt renamed as unko.txt.bak

$ rename -n 's/^(.{2})/$1-renamed-/' *
kuso.txt renamed as ku-renamed-so.txt
miso.txt renamed as mi-renamed-so.txt
unko.txt renamed as un-renamed-ko.txt
これらは実際には実行されていない。安心。
複雑なリネーム、移動のときには-n で確認しながらコマンドを書いていくといい。



まとめ


もちろんmvにサヨナラなんて無茶な話だが、
ls, find, grep とかをパイプでつなげて…とかやらなくても、単一のコマンドでパワフルなリネーム・移動が手軽にできるのはとても便利。
是非試してみてほしい。