こんな場面で手が止まってしまった経験はありませんか。100個のファイル名を1つずつ打ち直すのは現実的ではありません。
この記事では、ファイル名を一括変更できる rename コマンドの実践的な使い方を解説します。基本的な置換から、正規表現を使った複雑なリネーム、連番付与、拡張子の一括変更、そして実行前の安全確認まで、現場でそのまま使えるパターンを網羅します。
この記事のポイント
・rename には Perl版とutil-linux版の2系統があり書式が違う
・rename -n で実行前に変更内容を必ずプレビューできる
・rename 's/旧/新/' *.txt で正規表現による一括置換ができる
・拡張子変更・小文字化・連番付与も1コマンドで完結する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ rename コマンドが必要なのか?(mvとの違い)
ファイル名を変えるなら mv コマンドを思い浮かべる方が多いはずです。確かに mv はファイル名の変更にも使えますが、扱えるのは「1ファイルずつ」が基本です。たとえば「拡張子 .txt のファイルをすべて .bak にしたい」という場合、mv だけで実現しようとするとシェルのforループを組む必要があり、ひと手間かかります。
そこで活躍するのが rename コマンドです。rename はファイル名に対して「置換ルール」をまとめて適用できるため、複数ファイルのリネームを1行で完結できます。
複数ファイルの一覧確認には ls コマンドを併用すると、変更前後の状態を把握しやすくなります。ls コマンドの基本オプションもあわせて確認しておくと、リネーム作業がぐっと楽になります。
【重要】rename には2つの系統がある
最初に必ず押さえておきたい落とし穴があります。rename コマンドには互換性のない2系統が存在します。・Perl版(prename / file-rename):Debian・Ubuntu系で標準。Perlの正規表現 s/// を使う高機能タイプ
・util-linux版:RHEL・Rocky Linux・AlmaLinux系で標準。
rename 旧文字列 新文字列 ファイル という単純置換タイプ同じ rename という名前でも、ディストリビューションによって書式がまったく異なります。まずは自分の環境がどちらかを確認しましょう。
# 実行環境: Rocky Linux 9.4 / Ubuntu 24.04 LTS で動作確認済み # どちらの版か確認する $ rename --version /usr/bin/rename from util-linux 2.37.4 # Ubuntu系では次のように表示される $ rename --version /usr/bin/rename using File::Rename version 2.01
rename コマンドの基本的な使い方(Perl版)
Perl版 rename の書式はシンプルです。Perlの置換構文s/置換前/置換後/ を第1引数に渡し、続けて対象ファイルを指定します。
1. 書式を理解する
# 基本書式 # rename 's/置換前/置換後/' 対象ファイル... # 末尾が .txt のファイルを .bak に変更する $ ls data1.txt data2.txt data3.txt $ rename 's/\.txt$/.bak/' *.txt $ ls data1.bak data2.bak data3.bak
\.txt$ は「末尾の .txt」を意味します。ドットは正規表現で任意の1文字を表すため、文字としてのドットを指定するには \. とエスケープする点に注意してください。
2. rename -n で実行前にプレビューする
rename は一括でファイル名を書き換えるため、ルールを間違えると大量のファイルが意図しない名前になってしまいます。これを防ぐ最も重要なオプションが-n(または --no-act)です。-n を付けると、実際には変更せず「どう変わるか」だけを表示します。本番実行の前に必ず -n でプレビューする習慣をつけましょう。
# -n で変更内容をプレビュー(実際には変更しない) $ rename -n 's/\.txt$/.bak/' *.txt rename(data1.txt, data1.bak) rename(data2.txt, data2.bak) rename(data3.txt, data3.bak) # 内容を確認してから -v(詳細表示)付きで本番実行 $ rename -v 's/\.txt$/.bak/' *.txt data1.txt renamed as data1.bak data2.txt renamed as data2.bak data3.txt renamed as data3.bak
3. ファイル名の一部だけを置換する
拡張子だけでなく、ファイル名の途中にある文字列も置換できます。たとえば「img_」というプレフィックスを「photo_」に変えたい場合は次のようにします。$ ls img_001.jpg img_002.jpg img_003.jpg # img_ を photo_ に置換 $ rename -n 's/img_/photo_/' *.jpg rename(img_001.jpg, photo_001.jpg) rename(img_002.jpg, photo_002.jpg) rename(img_003.jpg, photo_003.jpg)
応用・実務Tips(正規表現・連番・拡張子変更)
ここからは現場でよく使う応用パターンを紹介します。Perl版の正規表現を活かすことで、複雑なリネームも1行で処理できます。1. ファイル名を小文字・大文字に統一する
Windowsからコピーしたファイル名に大文字が混在していると、Linuxでの扱いが煩雑になります。Perlの修飾子e(置換結果を式として評価)と関数 lc・uc を組み合わせると、一括で大文字小文字を変換できます。
$ ls README.TXT Report.DOC Sample.JPG # すべて小文字に変換する $ rename -n 'y/A-Z/a-z/' * rename(README.TXT, readme.txt) rename(Report.DOC, report.doc) rename(Sample.JPG, sample.jpg) # 拡張子だけを小文字にしたい場合(後半部分だけ変換) $ rename -n 's/(\.[^.]+)$/lc($1)/e' * rename(README.TXT, README.txt)
y/A-Z/a-z/ はPerlの文字変換(transliteration)で、tr コマンドと同じ発想です。テキスト処理全般での変換ロジックは、tr の考え方とも共通しています。Linux 基本コマンドの解説でテキスト操作の基礎を押さえておくと理解が早まります。
2. 連番をゼロ埋めで揃える
「file1.txt」「file10.txt」のように桁数がバラバラだと、ソート順が崩れます。sprintf を使ってゼロ埋め(zero padding)した連番に整えましょう。$ ls file1.txt file2.txt file10.txt # 数字部分を3桁ゼロ埋めにする $ rename -n 's/(\d+)/sprintf("%03d", $1)/e' *.txt rename(file1.txt, file001.txt) rename(file2.txt, file002.txt) rename(file10.txt, file010.txt)
(\d+) でキャプチャした数字を sprintf("%03d", $1) で3桁に整形しています。これでファイル名順とファイル番号順が一致し、ls の表示もきれいに揃います。
3. ファイル名の先頭・末尾に文字を追加する
日付プレフィックスを付けてバックアップ用に揃えたい、といったケースです。# 先頭に日付プレフィックスを付ける $ rename -n 's/^/20260606_/' *.log rename(access.log, 20260606_access.log) rename(error.log, 20260606_error.log) # 拡張子の前に _old を挿入する $ rename -n 's/(\.\w+)$/_old$1/' *.conf rename(httpd.conf, httpd_old.conf)
^ は行頭、$ は行末を表すアンカーです。これを使い分けることで、追加位置を自在にコントロールできます。こうしてリネームしたバックアップファイルは、tar でまとめてアーカイブしておくと管理しやすくなります。tar コマンドの実用例も参考にしてください。
4. util-linux版(RHEL系)での書き方
RHEL・Rocky Linux・AlmaLinux系で標準のutil-linux版は正規表現が使えず、単純な文字列置換のみです。書式が異なるので注意しましょう。# util-linux版の書式 # rename 置換前 置換後 対象ファイル... $ ls data1.txt data2.txt data3.txt # .txt を .bak に置換する $ rename .txt .bak *.txt $ ls data1.bak data2.bak data3.bak # Perl版を入れたい場合(dnf) $ sudo dnf install prename
「rename: not enough arguments」が出た時の対処法
rename を実行したときに遭遇しやすいエラーと、その原因を整理します。1. not enough arguments エラー
$ rename 's/.txt/.bak/' rename: not enough arguments Try 'rename --help' for more information.
2. 置換ルールが効かない・想定外の名前になる
正規表現のドットをエスケープし忘れると、意図しない箇所が置換されます。たとえば
s/.txt/.bak/ は「任意の1文字+txt」にマッチするため、mytxt.txt が my.bak.txt になってしまうことがあります。拡張子を確実に指定するには s/\.txt$/.bak/ のように \. と末尾アンカー $ を使ってください。こうした事故を防ぐためにも、本番前の
rename -n によるプレビューは省略しないでください。
3. ファイル名が重複して上書きされる
リネーム結果が既存ファイルと同名になると、デフォルトでは上書きされてしまいます。Perl版なら-o を付けない限り上書きを抑止するオプションはバージョン依存のため、-n でプレビューして重複が出ないかを必ず確認するのが安全です。
本記事のまとめ
rename コマンドは、複数ファイルのリネームを1行で完結できる強力なツールです。Perl版とutil-linux版で書式が違う点と、本番前に -n でプレビューする習慣を押さえれば、現場の面倒なリネーム作業が一気に効率化します。| やりたいこと | コマンド |
|---|---|
| どちらの版か確認する | rename --version |
| 実行前にプレビューする | rename -n 's/\.txt$/.bak/' *.txt |
| 拡張子を一括変更する(Perl版) | rename 's/\.txt$/.bak/' *.txt |
| 拡張子を一括変更する(util-linux版) | rename .txt .bak *.txt |
| ファイル名を小文字に統一する | rename 'y/A-Z/a-z/' * |
| 連番を3桁ゼロ埋めにする | rename 's/(\d+)/sprintf("%03d",$1)/e' *.txt |
| 先頭にプレフィックスを付ける | rename 's/^/20260606_/' *.log |
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Linuxサーバー構築入門マニュアル(図解60P)を無料でお渡ししています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:haproxyコマンドの使い方|Linuxでロードバランサーを構築する方法と設定例
- この記事の属するカテゴリ:Linuxtips・ファイル・ディレクトリ管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます