さわだのノート

書籍のお仕事に役立つかもしれない思いつきを記録しています。

RSS: 記事の更新情報 Rss Feed

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演算子で文字の入れ替えとかも簡単にできそうです。