全力で怠けたい

怠けるために全力を尽くしたいブログ。

rename コマンドでよく使うオプションのメモ。

reaname コマンドでわりとよく使うオプションのメモ。

rename コマンドのバージョン。

$ rename --man
NAME
    rename - renames multiple files

VERSION
    version 1.601
# 省略

普段は Mac で作業することが多いので rename コマンドは brew で入れたやつを使ってる。

$ brew install rename

rename コマンドのオプション

rename コマンドはファイル名を変更するコマンド。

普段は mv コマンドで事足りるんだけど拡張子とかを一括で変更したいときが面倒くさい。 たとえば JPEG ファイルの拡張子が .jpg.jpeg が混在していて .jpeg に揃えたいときに ls *.jpg | sed -e 's/.jpg//' | xargs -n1 -I{} mv {}.jpg {}.jpeg みたいに打つのがすごく面倒くさい。実際のとこはコマンド履歴を呼び出すだけなんだけど、やりたいこととやってることがパッとリンクしないしやっぱり面倒くさい。 Windows なら ren *.jpg *.jpeg で一発なのに。

たしかこんな経緯で便利そうなコマンドを探してて rename コマンドを見つけたんだけど、rename コマンドはかなり便利なのでわりとよく使うオプションをメモしておく。

-h, --help, --man オプション: ヘルプ

-h オプション、--help オプションを指定すると rename コマンドの使い方を表示する……んだけど man rename が使えないときにしか使わない。

--man オプションを指定すると man rename するのと同じマニュアルが表示する……んだけど普通に man rename しちゃうので全然使わない。

基本的な使い方

基本的な使い方は man renameSYNOPSIS のとこに書いてある rename [switches|transforms] [files] のとおり。

[switches|transforms] でオプションと変換ルールを指定して [files] で変換対象のファイルを指定する。

たとえば hoge.txtfuga.txt に変換するときはこんな感じで rename コマンドを実行する。 -s hoge.txt fuga.txt が switches でコマンドの一番後ろの hoge.txt が files を指定している。

$ rename -s hoge.txt fuga.txt hoge.txt

これは以下の mv コマンドと同じ結果になる。

$ mv hoge.txt fuga.txt

rename コマンドは switches の指定が冗長に感じるけど -s hoge.txt fuga.txt という switches は「hoge.txt を fuga.txt にリネームする」という意味なので、今回のように対象のファイル名がはっきり分かっているときは -s hoge fuga と指定しても同じ結果を得ることができる。

$ rename -s hoge.txt fuga.txt hoge.txt
# ↑と↓は同じ結果になる
$ rename -s hoge fuga hoge.txt

実は rename コマンドの switches は Perl のコマンドを書けるのでさきほどの -s hoge fuga はこんな感じに書くこともできる。 いろいろな書き方ができるから Perl のコマンドをガシガシ書いてもいいしやりたいことのオプションを指定するでもいいし、やりたいことと状況に応じて自分の好きな書き方でファイル名を変更できるのが rename コマンドのいいところだと思う。

$ rename 's/hoge/fuga/' hoge.txt

-v, --verbose オプション: 詳細情報を出力する

rename コマンドはファイル名を変更しても何も出力しないけど -v オプションか --verbose オプションを指定するとファイル名を変更したとかの詳細情報を出力する。

自分は実際にどのファイルの名前が変わったのかとか気になるので使うことが結構よく使う。

$ rename -v -s hoge fuga hoge.txt
'hoge.txt' renamed to 'fuga.txt'

-n, --just-print, --dry-run: ドライラン

-n オプションか --just-print オプションか --dry-run オプションを指定するとドライランする。

ファイル名の変更をミスると結構悲惨だと思うので、複雑な swithes を指定したり rename コマンドを本番環境で使うときは必ずドライランして意図するとおりの結果になることを確かめてから実際にファイル名を変更するようにしている。

$ ls hoge.txt
hoge.txt

$ rename -n -s hoge fuga hoge.txt
'hoge.txt' would be renamed to 'fuga.txt'

$ ls hoge.txt
hoge.txt

-s, --subst オプション: 置換

ここまで何も書かずに -s オプションを使ってきたけど -s オプションか --subst オプションを指定すると単純な置換ができる。

rename -s from to files みたいな感じで -s オプションか --subst オプションのすぐあとに置換元の文字列と置換前の文字列を指定する。 たぶん一番よく使うオプションだと思う。

$ rename -v -s hoge fuga hoge.txt
'hoge.txt' renamed to 'fuga.txt'

-S, --subst-all オプション: 全置換

-S オプションか --subst-all オプションは -S from to にみたいに指定すると変換対象のファイル名から見つかったすべての fromto に置換する。

たとえば変換対象のファイル名が hoge-hoge.txt のときに -S hoge fuga みたいな switches を指定するとファイル名のすべての hogefuga に置換するので変換後のファイル名は fuga-fuga.txt になる。

$ rename -v -S hoge fuga hoge-hoge.txt
'hoge-hoge.txt' renamed to 'fuga-fuga.txt'

ちなみに、さっきの -s オプションと --subst-s from to にみたいに指定すると変換対象のファイル名から最初に見つかった fromto に置換する。 つまり変換対象のファイル名が from を複数含むときは最初に見つかった from だけ to に置換して2個め以降の from は置換しない。

たとえば変換対象のファイル名が hoge-hoge.txt のときに -s hoge fuga みたいな switches を指定するとファイル名の最初の hoge だけ fuga に置換して2個めの hoge は置換しないので変換後のファイル名は fuga-hoge.txt になる。

$ rename -v -s hoge fuga hoge-hoge.txt
'hoge-hoge.txt' renamed to 'fuga-hoge.txt'

-x, --remove-extension オプション: 拡張子を取り除く

-x オプションか --remove-extension オプションを指定するとファイル名の末尾の拡張子を取り除く。

$ rename -v -x hoge.txt.bak
'hoge.txt.bak' renamed to 'hoge.txt'

-s オプションとかでも同じことはできるけど、やりたいことが「拡張子を取り除く」だけのときは -x オプションを使うほうが短く書けるし直感的なのでだいたい -x オプションを使ってる。

$ rename -v -s .bak '' *.bak
'hoge.txt.bak' renamed to 'hoge.txt'

$ rename -v 's/.bak\z//' *.bak
'hoge.txt.bak' renamed to 'hoge.txt'

-a, --append オプション: 文字列をファイル名の末尾に追加する

-a オプションか, --append オプションを指定すると文字列をファイル名の末尾に追加する。

$ rename -v -a .old hoge.txt
'hoge.txt' renamed to 'hoge.txt.old'

Perl のコマンドとかでも同じことはできるけど、やりたいことが「文字列を追加する」だけのときは -a オプションを使うほうが短く書けるし直感的なのでだいたい -a オプションを使ってる。

$ rename -v 's/\z/.old/' hoge.txt
'hoge.txt' renamed to 'hoge.txt.old'

c: 文字列をファイル名の先頭に追加する

-A オプションか --prepend オプションを指定すると文字列をファイル名の先頭に追加する。

$ rename -v -A [wip] hoge.txt
'hoge.txt' renamed to '[wip]hoge.txt'

Perl のコマンドとかでも同じことはできるけど、やりたいことが「文字列を追加する」だけのときは -A オプションを使うほうが短く書けるし直感的なのでだいたい -A オプションを使ってる。

$ rename -v 's/\A/[wip]/' hoge.txt
'hoge.txt' renamed to '[wip]hoge.txt'

-p, --mkpath, --make-dirs オプション: ディレクトリがないときに作成する

実は rename コマンドはファイル名を変更するだけでなくてファイルを別のディレクトリに移動することができてすごく便利なんだけど、移動先のディレクトリがないときはエラーになる。

-p オプションか --mkpath オプションか --make-dirs オプションを指定すると移動先のディレクトリがないときは rename コマンドが自動的に作ってくれる。

$ ls
hoge.txt

$ rename -v -p -s hoge hoge-files/hoge hoge.txt
'hoge.txt' renamed to 'hoge-files/hoge.txt'

$ ls hoge-files
hoge.txt

参考ページ