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(既定の
renameは Perl 版) - 他のディストリ(Fedora 等)では構文の違う util-linux 版 のことがある(第6章で解説)
1. rename コマンドとは何か?
結論:
renameは複数ファイルの名前を、パターンを使って一括で変換するコマンド。1個ずつmvする手間を消せる。
photo1.jpeg、photo2.jpeg... みたいなファイルが50個あって、全部の拡張子を .jpg に直したいんです。mv で1個ずつ直すしかないですか?rename なんだ。mv が「1個の名前を変える道具」なら、rename は「たくさんの名前を一括で変える道具」だよ。mv を打たなくていいんですか?.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
安全の鉄則
rename -n 'ルール' 対象で予定を確認- 表示が正しければ
-nを外して実行 - 不安なら
-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.txt と file.txt)を同じ名前に変換しようとすると、片方が 上書きされて消える 危険がある。y/// を使う前にも -n で予定をよく確認すること。
6. 2種類の rename に注意(Perl 版 / util-linux 版)
結論: 同じ
renameでも実装が2種類あり構文が違う。rename --versionでどちらか確認する。Ubuntu の既定は Perl 版。
実は rename には 名前が同じで中身が違う2つのコマンド がある。これが初心者の最大の混乱ポイント。
rename .jpeg .jpg *.jpeg みたいに スラッシュなし で書く例も出てきました。どっちが正しいんですか?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 を打ったのに、何も変わりませんでした。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.txt の draft を final に変えて、実際にリネームしてみよう(-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