技術メモ帳さんが、Linux の CUI で複数のファイルの名前をまとめて変更する方法をまとめておられる。bash/zsh から、rename コマンドに perl を使ったコマンドと、色んな方法が紹介されてて参考になる。ただ、Emacs を使った方法には触れられていなかった。というわけで、Emacs を使う一括リネームの方法について書いてみる。
Emacs / Dired
Emacs で複数ファイルの一括リネームを実行するには、Dired モードを使う。M-x dired (or C-x d) して、リネームしたいファイルを含むディレクトリーを開く。
Dired では、一括リネームを二つのコマンドを組み合わせて実行する。
- % m (M-x dired-mark-files-regexp)
- 正規表現にマッチしたファイルに * マークを付ける。
- % r (M-x dired-do-rename-regexp)
- * マークの付いたファイルに対して、ファイル名の置換を実行する。
例えば、拡張子を .htm から .html に変更する場合、次のような操作になる。
% m ; dired-mark-files-regexp の実行 Mark files (regexp): \.htm$ ; 拡張子 .htm を持つファイルをマークする % r ; dired-do-rename-regexp の実行 Rename from (regexp): \.htm$ ; 被置換部分を正規表現で指定 Rename \.htm$ to: .html ; 置換する語を指定 Rename `foo.htm' to `foo.html'? [Type yn!q or C-h] ; ファイル名の置換について質問 ; OK なら y, NO なら n, 一括置換なら !, 中止なら q
Dired のよい所は、Emacs の中だけでリネーム操作が完結すること。ファイルをマークする時にも正規表現が使えること。リネームしたくないファイルがある場合は、置換を実行する前に u キーでそのファイルのマークを外せること。ファイル名の置換に、Emacs の置換機能がフルに使えることが挙げられやう。
複雑なファイル名の一括変更が必要になった時に、重宝するはず。
Dired のリネーム用コマンド その二
Dired の置換以外のリネーム関連のコマンドもせっかくなので紹介しませう。
- % l (dired-downcase)
- マーク付ファイルのファイル名を全て小文字にする
- % u (dired-upcase)
- マーク付ファイルのファイル名を全て大文字にする
この他にも、マークしたファイルのコピー (% C)、ハードリンク (% H)、シンボリック・リンク (% S)、削除フラッグ (% d) といったコマンドも用意されてる。興味のある方は、Emacs の info を参照されたし。
こういうときはwdiredが便利です。
ReplyDeletehttp://www.bookshelf.jp/soft/meadow_25.html#SEC292
コメントありがとうございます。wdired は知りませんでした。% R より手軽に使えますね。素晴らしい!
ReplyDeletePS. Emacs 22.0.* では wdired は autoload されてるみたいです。