rename コマンド入門 - 複数ファイルを一括リネームする

rename コマンド入門 - 複数ファイルを一括リネームする

この記事で学べること

  • rename複数ファイルの名前を一気に変える 方法が分かる
  • 実行前に -n「何が起きるか」を必ず確認 する安全な型が身につく
  • s/古い/新しい/置換パターン で拡張子や文字列を一括変換できる
  • 名前が似ている 2種類の rename(Perl 版と util-linux 版)の違い を見分けられる

結論(先に覚えるべき型)

  • まず確認 → rename -n 's/古い/新しい/' *(実行せず予定だけ表示)
  • 問題なければ実行 → rename 's/古い/新しい/' *
  • 大文字を小文字に → rename 'y/A-Z/a-z/' *
  • どっちの rename か迷ったら → rename --version で確認

前提(対象環境)

  • OS:Ubuntu / Debian(既定の renamePerl 版
  • 他のディストリ(Fedora 等)では構文の違う util-linux 版 のことがある(第6章で解説)

1. rename コマンドとは何か?

結論: rename は複数ファイルの名前を、パターンを使って一括で変換するコマンド。1個ずつ mv する手間を消せる。

リナ: 先輩、photo1.jpegphoto2.jpeg... みたいなファイルが50個あって、全部の拡張子を .jpg に直したいんです。mv で1個ずつ直すしかないですか?
ライニー先輩: それを全部手でやるのは大変だよね。そういう 「同じパターンの名前変更をまとめてやる」 ときに使うのが rename なんだ。mv が「1個の名前を変える道具」なら、rename は「たくさんの名前を一括で変える道具」だよ。
リナ: 50回 mv を打たなくていいんですか?
ライニー先輩: そう。1回のコマンドで50個まとめて変えられる。しかも .jpeg の部分だけを .jpg に置き換える、みたいな パターン指定 ができるのが強みなんだ。

rename の基本イメージ

rename 's/jpeg/jpg/' *.jpeg
        ↑           ↑
        |           対象ファイル(ここでは .jpeg 全部)
        変換ルール(jpeg を jpg に置き換える)

「ファイル名の中の jpeg を見つけて jpg に書き換える」を、対象ファイル全部に対して一気に行う。

2. なぜ rename を使うのか?

結論: mv は1個ずつの変更には向くが、数十個を同じルールで変えるには非効率。rename ならパターンを1回書くだけで済む。

リナ: そもそも mv でも名前は変えられますよね? なぜわざわざ rename を覚えるんですか?
ライニー先輩: いい疑問。mv old.txt new.txt のように 1個の名前を変える なら mv で十分なんだ。問題は 「100個のファイルを同じルールで変えたい」 とき。mv だと100回打つことになる。
リナ: たしかに、それは現実的じゃないですね...。
ライニー先輩: rename なら 「ルールを1回書く」だけ で全部に適用される。たとえば「ファイル名の先頭に 2026_ を付ける」「スペースをアンダースコアに変える」みたいな作業が一発で終わる。手作業のミスも減るんだ。

ファイル名の変更は 元に戻しにくい操作mv を50回打てば打ち間違いも起きる。rename でルールをまとめれば、確認すべき箇所が「ルール1個」に集約されるので、かえって安全になる。ただし ルールを間違えると一気に50個壊す ので、次章の -n(事前確認)が必須になる。

3. まず -n で確認する(最重要の型)

結論: rename は実行前に必ず -n を付けて「何がどう変わる予定か」を表示させる。問題なければ -n を外して本実行する。

rename でいちばん大事なのは、いきなり実行しない こと。まず -n--nono、何もしないモード)を付けて、変更の 予定だけ を表示させる。

$ rename -n 's/jpeg/jpg/' *.jpeg
rename(photo1.jpeg, photo1.jpg)
rename(photo2.jpeg, photo2.jpg)
rename(photo3.jpeg, photo3.jpg)
リナ: rename(photo1.jpeg, photo1.jpg) って出ましたけど、ファイルは変わってないんですか?
ライニー先輩: そう、-n を付けている間は 1個も変わっていない。これは「もし実行したら、こう変える予定だよ」というプレビューなんだ。rename(変更前, 変更後) の形で表示される。
リナ: なるほど、先に予定を見せてくれるんですね。安心です。
ライニー先輩: 表示された内容が思った通りなら、-n を外して同じコマンドをもう一度打つ。それで本当にリネームされる。

予定を確認できたら、-n を外して本実行する。

$ rename 's/jpeg/jpg/' *.jpeg

これで実際にファイル名が変わる。-v--verbose)を付けると、実際に変えた名前を表示してくれる。

$ rename -v 's/jpeg/jpg/' *.jpeg
photo1.jpeg renamed as photo1.jpg
photo2.jpeg renamed as photo2.jpg

安全の鉄則

  1. rename -n 'ルール' 対象 で予定を確認
  2. 表示が正しければ -n を外して実行
  3. 不安なら -v で実行結果も表示

この「確認 → 実行」の2段構えを必ず守る。

4. s/// で文字列を置き換える

結論: 's/置換前/置換後/' がもっとも使う形。ファイル名の中の文字列を別の文字列に置き換える。

Ubuntu の rename(Perl 版)は、's/古い/新しい/' という 置換ルール を書く。これは Perl の置換構文で、s は substitute(置換)の意味。

# 拡張子 .jpeg を .jpg に
$ rename -n 's/jpeg/jpg/' *.jpeg

# ファイル名の "draft" を "final" に
$ rename -n 's/draft/final/' *

# 先頭に "2026_" を付ける(^ は行頭の意味)
$ rename -n 's/^/2026_/' *

# 末尾に ".bak" を付ける($ は行末の意味)
$ rename -n 's/$/.bak/' *
リナ: s/jpeg/jpg/ の最初の s は何ですか? スラッシュで区切られていますね。
ライニー先輩: s は「置き換える(substitute)」という合図。s/A/B/「A を見つけて B に置き換える」 という意味になる。スラッシュ / は区切り文字。s/置換前/置換後/ と覚えればいいよ。
リナ: ^ とか $ も出てきましたが、これは?
ライニー先輩: それは 位置を表す記号 なんだ。^ は「名前の先頭」、$ は「名前の末尾」。だから s/^/2026_/ は「先頭に 2026_ を足す」、s/$/.bak/ は「末尾に .bak を足す」になる。最初は深く考えず、この2つの型を覚えれば十分。

よく使う置換パターン

やりたいこと ルール
拡張子を変える s/jpeg/jpg/
文字列を入れ替える s/draft/final/
先頭に文字を足す s/^/prefix_/
末尾に文字を足す s/$/_suffix/
文字列を消す s/_copy//

置換後を空 // にすると「その文字列を削除」になる。

5. 大文字小文字をそろえる(y///)

結論: 'y/A-Z/a-z/' で大文字を小文字に一括変換できる。文字を1対1で置き換える変換ルール。

ファイル名の大文字を小文字にそろえたいときは、'y/A-Z/a-z/' を使う。y は文字単位の置き換え(transliterate)。

# 大文字をすべて小文字に
$ rename -n 'y/A-Z/a-z/' *

# 小文字をすべて大文字に
$ rename -n 'y/a-z/A-Z/' *
リナ: IMG_001.JPG みたいに大文字が混ざったファイルを、全部小文字にそろえたいんです。
ライニー先輩: それなら y/A-Z/a-z/ がぴったり。A-Z(大文字のA~Z)を、対応する a-z(小文字のa~z)に1文字ずつ置き換える。IMG_001.JPG なら img_001.jpg になるよ。
リナ: s/// とは違うんですか?
ライニー先輩: s/// は「文字列のかたまり」を置き換えるもの。y/// は「1文字ずつ」を対応表で置き換えるもの。大文字小文字の変換みたいに 文字の種類をまとめて変える ときは y/// が向いているんだ。

大文字小文字だけが違う2つのファイル(File.txtfile.txt)を同じ名前に変換しようとすると、片方が 上書きされて消える 危険がある。y/// を使う前にも -n で予定をよく確認すること。

6. 2種類の rename に注意(Perl 版 / util-linux 版)

結論: 同じ rename でも実装が2種類あり構文が違う。rename --version でどちらか確認する。Ubuntu の既定は Perl 版。

実は rename には 名前が同じで中身が違う2つのコマンド がある。これが初心者の最大の混乱ポイント。

リナ: ネットで調べたら、rename .jpeg .jpg *.jpeg みたいに スラッシュなし で書く例も出てきました。どっちが正しいんですか?
ライニー先輩: どちらも正しいんだけど、別物の rename なんだ。世の中には主に2種類ある。
リナ: 同じ名前なのに中身が違うんですか...?
ライニー先輩: そう。だから最初に 自分の rename がどっちか を確かめるのが大事。rename --version を実行すればわかるよ。
$ rename --version

Perl 版(Ubuntu / Debian の既定)なら、File::Rename のような表示が出る。

/usr/bin/rename using File::Rename version 1.xx

util-linux 版なら、util-linux の文字が出る。

rename from util-linux 2.xx

2つの rename の違い

項目 Perl 版(file-rename) util-linux 版
主な環境 Ubuntu / Debian Fedora / RHEL 等
書き方 rename 's/A/B/' * rename A B files
パターン Perl 正規表現が使える 単純な文字列置換のみ
事前確認 -n -n

この記事は Perl 版(Ubuntu 既定)が前提。util-linux 版での .jpeg.jpg は次のように書く。

util-linux 版を使っている場合の同じ操作は、こうなる。

# util-linux 版:rename 置換前 置換後 対象ファイル
$ rename .jpeg .jpg *.jpeg

Ubuntu で Perl 版が入っていない場合は sudo apt install rename で導入できる(インストールは管理者権限が必要)。まずは rename --version で確認するのが先決。

7. よくある初心者のつまずき

結論: -n を付け忘れて即実行、対象ファイルの指定ミス、Perl 版と util-linux 版の取り違えが3大失敗。

7-1. -n を付けずにいきなり実行する

# NG: 確認なしで即実行(ルールが間違っていたら全部巻き込む)
$ rename 's/a/b/' *

# OK: まず -n で予定を確認してから
$ rename -n 's/a/b/' *

リネームは元に戻しにくい。必ず -n で予定を見てから 本実行する。これだけで事故の大半は防げる。

7-2. 対象ファイルの指定が広すぎる

# 危険: カレントの全ファイルが対象になる
$ rename -n 's/o/0/' *

# 安全: 対象を .txt に絞る
$ rename -n 's/o/0/' *.txt

* はカレントディレクトリの すべてのファイル を指す。意図しないファイルまで対象に入らないよう、*.txt のように範囲を絞る。

7-3. Perl 版のつもりで util-linux 版を使っている

リナ: rename 's/jpeg/jpg/' *.jpeg を打ったのに、何も変わりませんでした。
ライニー先輩: それは util-linux 版の rename を使っている可能性が高い。util-linux 版は s/.../...// の正規表現を理解しないんだ。rename --version で確認して、util-linux 版なら rename .jpeg .jpg *.jpeg の書き方に切り替えよう。

8. ミニ課題:実際にやってみよう

結論: 練習用ファイルを作り、置換・接頭辞付与・小文字化の3問を -n 付きで確かめる。

リナ: 手を動かして試したいです! でも本物のファイルで失敗するのが怖くて...。
ライニー先輩: そのために 練習用の空ファイル を作ろう。touch で作れば中身が空だから、壊れても痛くないよ。まず作業用フォルダを作って試そう。

練習用ファイルを用意する。

$ mkdir rename-practice && cd rename-practice
$ touch photo1.JPEG photo2.JPEG report_draft.txt

課題1: .JPEG.jpg に変える予定を、まず -n で表示してみよう。

ヒントを見る

rename -n 's/置換前/置換後/' 対象 の形。拡張子 .JPEG.jpg に置き換える。

解答例
$ rename -n 's/JPEG/jpg/' *.JPEG

rename(photo1.JPEG, photo1.jpg) のように予定が表示されれば成功。

課題2: report_draft.txtdraftfinal に変えて、実際にリネームしてみよう(-n で確認してから実行)。

ヒントを見る

まず -n で確認 → 問題なければ -n を外す。

解答例
$ rename -n 's/draft/final/' report_draft.txt
$ rename 's/draft/final/' report_draft.txt

report_final.txt になっていれば成功。

課題3: 残ったファイル名の大文字をすべて小文字にそろえてみよう。

ヒントを見る

文字単位の変換は y/A-Z/a-z/

解答例
$ rename -n 'y/A-Z/a-z/' *
$ rename 'y/A-Z/a-z/' *

9. コピペ用テンプレート

結論: 確認・置換・接頭辞接尾辞・小文字化・確認方法のよく使う型をまとめて手元に置いておく。

よく使う型をまとめておく(Perl 版前提)

# まず予定を確認(最重要)
rename -n 's/古い/新しい/' *

# 確認後に本実行
rename 's/古い/新しい/' *

# 拡張子を変える
rename -n 's/jpeg/jpg/' *.jpeg

# 先頭に文字を足す
rename -n 's/^/2026_/' *

# 末尾に文字を足す
rename -n 's/$/.bak/' *

# 文字列を削除する
rename -n 's/_copy//' *

# 大文字を小文字にそろえる
rename -n 'y/A-Z/a-z/' *

# どの rename か確認する
rename --version

次に読む