2016年12月25日

vimを使ってファイル名を一括変更(リネーム)する

複数のファイル名を一括変更(リネーム)する時、どういった方法で行わているでしょうか?
専用のリネームツールを使うのも一つの手ですが、自分はもっぱらvimとコマンドプロンプトを使った方法で行っています。この方法のメリットとして、

  1. 普段使い慣れたvimコマンドで編集ができる
  2. リネーム操作を(ある程度)やり直すことができる
  3. Windowsに限らず、MacやLinuxでも似たような操作で実行できる

があげられます。
今回は、録画データのファイル名をリネームする方法を例に取って説明します。

リネーム元ファイルパスの取得

まず最初に、リネームしたいファイル一式が格納されているフォルダーをエクスプローラーで開きます。
そこでファイルを全て選択し、Shiftキーを押しながら右クリックを押すと、「パスのコピー」という項目が出てくるので、それを選択してファイルパスをクリップボードにコピーします。
次にvimを開いて、先ほどクリップボードにコピーしたファイルパスをエディター上に貼り付けます。
この際、場合によっては名前順に貼り付いていない事があるので、SHIFT+Vキーを押してこれら全てを行選択し、:sortと入力して選択範囲をソートしておきます。

フォルダーパスの除去(リネーム元ファイル名のみに編集)

貼り付けた文字列を見ると、行毎に両端がダブルクォーテーションでくくられており、ドライブ名から親フォルダーまでのフルパスが記載されています。
リネーム作業自体には影響ないのですが、事故防止のためControl+Vキーを押してドライブ名から親フォルダーまでの部分を矩形選択し、dキーを押して削除しておきます。
これで、ファイル名のみがダブルクォーテーションでくくられた状態になるはずです。
削除が不十分orし過ぎた場合は、慌てずuキーを押してアンドゥ(元に戻して)やり直します。

リネーム先ファイル名の準備

リネーム元ファイル名の準備ができたところで、今度はリネーム先ファイル名を準備します。
番組名には、タイトルや話数の他にサブタイトルなどの情報がありますが、それらをExcelなどの表形式であらかじめまとめておきます。もしくは、インターネット上に同じく表形式でまとまっている場合、それらをクリップボードにコピーしてvimに貼り付けます。
今回はWikipediaの源氏物語より、各帖と名前を話数とサブタイトルに見立ててリネーム先ファイル名とします。
上記表をブラウザーで開いたら、左端の列から右端まで13行分をマウスでドラッグして選択し、クリップボードにコピーしvimに貼り付けます。

リネーム先ファイル名の形式

貼り付けられた文字列をよく見ると、各項目がタブ文字<TAB>で区切られているかと思います。
このように、特定の区切り文字を挟んで行列(行方向は改行)の形になっている文字列を別の形に整形する場合は、正規表現のグループ化による一括置換が便利です。
なお、リネーム先ファイル名は、以下のフォーマットで整形します。

”タイトル<SP>第00話<SP>「サブタイトル」.mp4”
<SP>は半角スペース
00の部分は、話数の番号を2桁でゼロパディングしたもの
サブタイトルは、全角の括弧でくくられるようにする
末尾には拡張子.mp4を設定

リネーム先ファイル名の整形

では実際の整形作業を行ってみます。
まず、第1話~第9話の部分に矩形選択を使って"0"を挿入しておきます。
次に、話数とサブタイトルを行選択し、:キーを押した後に一括置換の正規表現パターンを入力します。

'<,'>s/^\(.\{-}\)<09>\(.\{-}\)<09>.*$/"リネームされた番組名 第\1話 「\2」.mp4"/

'<,'>の部分が「現在選択されている行」を表し、それに対して一括置換"s"をかける宣言を行い、置換元のパターンと置換先のパターンを"/"で区切って入力します。
置換元パターンに含まれるタブ文字<09>は、\tではなくControl+vキーを押した後にTABキーを押して制御文字として入力します。なお、\{-}は最短マッチ(.*?)になります。

リネームコマンドライン文字列の作成

ここまでできたら、リネーム先ファイル名をControl+vキーを押して矩形(ビジュアル)選択し、リネーム元ファイル名の右隣にペーストします。両端の間の空白はいくつあっても構いません。
最後に、先頭行にカーソルを移動してControl+vキーを押し、最下行までカーソルを移動したらShift+iキーを押して"ren "(スペース入力を忘れないこと)と入力し、リネームコマンドを完成させます。

リネームの実行

リネーム元ファイル名とリネーム先ファイル名が一致している事を確認できたら、いよいよリネームコマンドを実行します。
リネーム元ファイル名が格納されているフォルダーを右クリックすると、メニューに「コマンドウィンドウをここで開く」という項目が出てくるので、それを選択してコマンドプロンプトを開きます。
コマンドプロンプトが開いたら、リネーム元ファイルが存在することを確認し、先ほど作成したリネームコマンドライン文字列を貼り付けてリネーム処理を実行します。

リネームに失敗した場合

万が一リネームに失敗していた場合でも、コマンドに誤りがない限りはファイルが消えたりすることはありません。
念のため話数とファイル名が一致している事を確認し、リネーム作業を最初からやり直せばOKです。