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 rename
の SYNOPSIS
のとこに書いてある rename [switches|transforms] [files]
のとおり。
[switches|transforms]
でオプションと変換ルールを指定して [files]
で変換対象のファイルを指定する。
たとえば hoge.txt
を fuga.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
にみたいに指定すると変換対象のファイル名から見つかったすべての from
を to
に置換する。
たとえば変換対象のファイル名が hoge-hoge.txt
のときに -S hoge fuga
みたいな switches を指定するとファイル名のすべての hoge
が fuga
に置換するので変換後のファイル名は fuga-fuga.txt
になる。
$ rename -v -S hoge fuga hoge-hoge.txt 'hoge-hoge.txt' renamed to 'fuga-fuga.txt'
ちなみに、さっきの -s
オプションと --subst
は -s from to
にみたいに指定すると変換対象のファイル名から最初に見つかった from
を to
に置換する。
つまり変換対象のファイル名が 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