bash&Perl! ワンライナーでファイル名の置換リネームをお手軽に
SkitchでHistoryに保存したファイルをドラッグ&ドロップでエクスポートすると、拡張子の前に「-1」みたいな数字がついてきました。
もともとこんな感じのファイル名だったのですが、
62-1.jpg 62-2.jpg 63-1.jpg 63-2.jpg 63-3.jpg
エクスポートしたファイルは「-1」がついてきます。
62-1-1.jpg 62-2-1.jpg 63-1-1.jpg 63-2-1.jpg 63-3-1.jpg
ちなみに2回目のエクスポートでは「-2」がついてきました。
ひととおり設定を見てみてたのですが、この「-数字」がついてくるのを止める設定はないようです。しかし、いちいちリネーマーで直すのも面倒くさい。
というわけで、ターミナルで一括置換ができないか試してみました。
Macはrenameコマンドがない
Linuxにはrenameという便利なコマンドがあるらしく、今回のような特定文字列の置換を目的としたリネームが簡単に行えます。
$ rename '-1' '' *.jpg
こんな感じでリネームできちゃうんじゃないでしょうか。便利です。
しかし、Macにはこのコマンドはありません。
Perlのワンライナーで何とかする
標準のコマンドで無理なら、Perlのワンライナーで何とかするしかありません。
Perlには組み込みの関数としてrenameが用意されているので、こいつを使ってみることにしました。
文字列の置換はPerlお得意の正規表現で。Perl 5.14以降では「s/match/replace/r」のようにrオプションをつけることで、スカラーコンテキストで置換後の文字列を返してくれます(非破壊オプションと言うらしい)。このrオプションはtr演算子でも使えるようです。
で、こちらがリネームのワンライナー。
$ ls | grep .jpg | perl -nle 'rename $_, s/-\d(?=\.jpg)//r'
意外と短く書けました。
Perl自身のオプションは、
-n | 1行ずつ処理 |
-l | 文字列をうまいことchompする |
-e | 以降の文字列をスクリプトとして解釈 |
てな感じです。-n, -lを入れておかないとうまいこと動きません。
今回は特定の文字列を削るだけでしたが、応用すれば結構程度自由にリネームができちゃいそうですね。tr演算子で文字の入れ替えとかも簡単にできそうです。