はじめに
画像などのファイル名を一括で変更したい、という場面に何度も直面してきました。
便利なソフトウェアや、シェルスクリプト(Windowsだとバッチファイル)を作成しても良いのですが、Vim でもサクッと似たようなことができます。
「Vim はこんな使い方もできる」と知っておくと、意外と重宝するので記事にしました。
Vim を使ったファイル整理術(基礎)
ファイル一覧を取得
フォルダ内にあるjpg
ファイルを取得するには、下記のコマンドを使います。put
コマンドは空行が発生するので、global
コマンドで空行を削除します。
:put!=expand('*.jpg')|g/^$/d
mv コマンドのひな形を作成
ファイルリストからコマンドのひな形を作成します。
:%s/\(.*\)$/mv "\1""PREFIX_\1"/ge
リネーム処理の実行
Windows の場合、エンコードによりファイル名が正しく処理できない場合があります。
fileencoding を cp932
に変更してバッチ処理に渡します。
# Unix
:w!sh
# Windows
:set fenc=cp932
:w!cmd
Vim を使ったファイル整理術(応用)
前述したリネーム処理を応用して、連番をつけたファイル名に一括変換する処理を実行します。
ファイルリストに対して、コマンドのひな形を作成します。global
コマンドは重複させられないため、ファイルリスト取得とは別で実行します。
:g/^/| s/.*/\="mv \"".submatch(0)."\" PREFIX_".line('.')/ | s/_\(\d\{1}\)$/_0\1/e| s/_\(\d\{2}\)$/_0\1/e | s/_\(\d\{3}\)$/_\1.jpg/e
処理について補足します。
まず g/^/
で全ての行を対象に処理をおこないます。
sed
コマンドで、オリジナルファイル名(submatch(0)
)、変更後のファイル名(PREFIX_000.jpg
)を置換するコマンドを作成します。
オリジナルファイル名は空白スペースを含む可能性があるため、ダブルクォーテーションで囲みます。line('.')
は現在行を取得する vimscript の関数です。
取得した行数は zero supply されてないため、1 ~ 9 行目に対してゼロを補完します。(2個目の sed
)
3個目の sed
で 1 ~ 99 行目対して、ゼロを補完しています。
最後の sed
で拡張子 jpg を補完します。この処理は 1 ~ 999 行目に実行します。
これで mv
コマンドのひな形が完成したので、:w !sh
で実行すれば完成です。
おわりに
世の中には便利なソフトウェアがたくさんあるので、必ずしも Vim でやる必要はないと思います。
一方で、 Vim エディタとしての機能と、シェルを実行する機能を持ち合わせているため、がっつりシェルスクリプトを書くのはしんどいようなケースで役に立つことがあります。
Vim はシンプルでありながら、強力な機能を持っているのでお気に入りのエディタのひとつです。
もし他にもおすすめの Vim 活用方法があれば、シェアしていただけると幸いです。