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

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

この記事でできるようになること

  • `rename -n` で変更の予定を先に確認してから本実行できる
  • `s/古い/新しい/` で拡張子や文字列を一括で置き換えられる
  • Perl 版と util-linux 版を `rename --version` で見分け、書き方を切り替えられる

前提知識(先に読むと理解しやすい記事)

この記事で学べること

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

言葉の整理

rename はファイルの名前を書きかえるコマンドです。だからこそ、最初に -n を覚えます。-n を付けている間は 1 個も変わりません。

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

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

前提(対象環境)

  • OS:Ubuntu / Debian です。既定の renamePerl 版 です
  • 他のディストリビューション(Fedora 等)では util-linux 版 のことがあります。書き方が違います(第 6 章で解説します)

安全に試すための 3 つの型

rename を間違えると、複数のファイル名が一度に変わります。元の名前は自動では戻りません。次の 3 つを守れば安全に練習できます。

  1. 練習用のディレクトリを作り、その中だけで試す(例:mkdir -p ~/rename-practice && cd ~/rename-practice
  2. touch で作った空ファイルなど、消えて困らないファイルで試す
  3. 本実行の前に必ず -n を付けて、変更の予定を目で確かめる

なお rename は本サイトの仮想ターミナル入力したコマンドを解釈してコンピュータに実行させる対話プログラム。には入っていません。実機の Linux か WSL で試してください。だからこそ、上の 3 つを守ってください。

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

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

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

rename の基本イメージ

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

やっていることは 1 つです。「ファイル名の中の 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 の短い書き方で、何もしないモードのことです。

-n を付けると、変更の 予定だけ が表示されます。

$ 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/// が向いているんだ。

5-1. リナの失敗:片方だけ名前が変わらなかった

リナ: 練習用フォルダで File.txtfile.txt を作りました。そこで rename 'y/A-Z/a-z/' * を実行したら、見慣れないメッセージが出ました。
$ ls
File.txt  file.txt
$ rename 'y/A-Z/a-z/' *
File.txt not renamed: file.txt already exists
$ ls
File.txt  file.txt
リナ: えっ、2 つとも小文字にそろうと思っていました。片方が変わっていません。
ライニー先輩: 変換後の名前は file.txt になるよね。でも、その名前のファイルはもうそこにあったんだ。
ライニー先輩: Ubuntu の rename(Perl 版)は、変換先が既にある場合は上書きせずに止まる。だから not renamed と出たんだよ。
リナ: 勝手に上書きされないんですね。それは意外でした。
ライニー先輩: そう。ただし -f を付けたときだけは上書きする。取り消せないから、この記事では -f を使わないでほしい。
リナ: 納得しました。not renamed が出たら「その名前はもうある」という合図として読みます。

-n を付けても、この判定は先に働きます。だから予定を見る段階で気づけます。

$ rename -n 'y/A-Z/a-z/' *
File.txt not renamed: file.txt already exists

大文字小文字だけが違う 2 つのファイルに注意してください。File.txtfile.txt は、小文字にそろえると同じ名前になります。

既定では 上書きされずスキップされますnot renamed と出た行は、変換されていないという意味です。

-f--force)を付けたときだけは上書きされ、元のファイルは戻せません。この記事では -f を使いません。

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
パターン 正規表現が使える 単純な文字列置換のみ
事前確認 -n -n

正規表現とは、文字の並びをパターンで指定する書き方です。この記事で使う s/A/B/ もその一種です。

この記事は 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 -p ~/rename-practice && cd ~/rename-practice
$ touch photo1.JPEG photo2.JPEG report_draft.txt

課題 1: .JPEG.jpg に変える予定を、実行せずに表示してみよう。

ヒント 1(方向づけ)を見る

まだ実行はしません。「もし実行したらこうなる」という予定だけを出します。

そのためのオプションを 1 つ付けます。

ヒント 2(コマンド名)を見る

使うのは rename です。予定だけを出すのは -n です。ルールは 's/置換前/置換後/' の形で書きます。

対象は *.JPEG と指定します。

答えを見る
$ rename -n 's/JPEG/jpg/' *.JPEG
rename(photo1.JPEG, photo1.jpg)
rename(photo2.JPEG, photo2.jpg)

このように予定が表示されれば成功です。ファイルはまだ 1 個も変わっていません。

課題 2: report_draft.txtdraftfinal に変えよう。予定を確認してから本実行します。

ヒント 1(方向づけ)を見る

同じコマンドを 2 回打ちます。1 回目は予定の確認、2 回目が本実行です。

2 回目では、確認用のオプションを外します。

ヒント 2(コマンド名)を見る

ルールは 's/draft/final/' です。1 回目は -n を付けます。2 回目は -n を外します。

対象はファイル名を直接書けます。

答えを見る
$ rename -n 's/draft/final/' report_draft.txt
$ rename 's/draft/final/' report_draft.txt
$ ls
photo1.JPEG  photo2.JPEG  report_final.txt

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

課題 1 は -n だけで終えたので、.JPEG はまだ変わっていません。ここでも「-n の間は 1 個も変わらない」を確認できます。

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

ヒント 1(方向づけ)を見る

文字列のかたまりではなく、1 文字ずつを対応表で置き換えます。s/// とは別の記号を使います。

先に -n で予定を確認してください。not renamed の行が出ないかを見ます。

ヒント 2(コマンド名)を見る

使うのは y/A-Z/a-z/ です。rename の後ろにクォートで囲んで書きます。対象は * です。

答えを見る
$ rename -n 'y/A-Z/a-z/' *
$ rename 'y/A-Z/a-z/' *

not renamed: ... already exists と出た行は、変換されていません。その名前のファイルが既にあるという合図です。

9. 練習用ディレクトリを片づける

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

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

よく使う型をまとめておく(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

11. 振り返り

リナ: 整理します。rename はルールを 1 回書くだけで、たくさんの名前をまとめて変えられるんですね。
ライニー先輩: そのとおり。だからこそ、ルールを間違えると一度に全部が変わる。
リナ: そこで -n を先に付けて、予定を目で確かめるんでした。
ライニー先輩: よく覚えていたね。File.txtfile.txt の失敗も、-n を見ていれば気づけたはずだよ。

今日の 3 行まとめ

  1. rename はルールを 1 回書くだけで、複数のファイル名をまとめて変えられる
  2. 本実行の前に必ず -n を付ける。予定が出るだけで、ファイルは 1 個も変わらない
  3. s/古い/新しい/ は文字列の置き換え、y/A-Z/a-z/ は 1 文字ずつの置き換えに使う

次に読む

この記事を共有

次の一手