「あれ…?linux 名前変更 したいだけなのに、どうやるの!?」
「Windowsの ren コマンドと同じ感覚で rename って打っても、エラーになるんだけど!?」
Linuxを使い始めたばかりの時、あるいはWindowsやmacOSの画面操作に慣れていると、ごくごく基本的な操作でさえ戸惑っちゃうこと、ありますよね。
もしかして、「linux mv っていうコマンドがあるけど、これって『Move(移動)』だから違うんじゃないの…?」って混乱していませんか…?
それとも、「linux ファイル名変更 したいファイルがいっぱいありすぎて、もう途方に暮れていたり…?
わかります、わかります!私も全く同じ経験があります。
ただ名前を変えたいだけなのにコマンドがわからないし、「もしかして、Linuxって名前変更できないの…?」「変なコマンド打ってファイル消えたりしない…?」って、もうパニックになっちゃいますよね😥
でも、大丈夫です!
その焦る気持ち、よーくわかります。Linuxでもちゃんと、カンタンに名前変更できますよ!
結論から言うと、Linux(やUNIX)の世界では、ファイルやディレクトリの基本的な名前変更は mv コマンドで行うんです。
この mv コマンドは「Move(移動)」の略なんですが、Linuxの仕組み上、「ファイルの移動」と「ファイルの名前変更」は、本質的にほぼ同じ操作として扱われるんですよ😲
この記事は、そんな「linux リネーム 難民」になってしまったあなたを救うための、安全な対処法をステップバイステップで徹底的に解説する「完全ガイド」です🕵️♀️✨
「なぜLinuxでは mv コマンドで名前変更するのか?」っていう根本的な理由から、「安全な mv コマンドの使い方」「ディレクトリ名を変更する時の重大な注意点」、さらには「複数のファイルを一括でリネームする強力な rename コマンド」まで。
私と一緒に、一つずつ冷静に確認していきましょうね🥰
Linuxの名前変更の基本概念 – なぜ mv コマンドが linux リネーム なのか?
WindowsやmacOSのキレイな画面(GUI)では、ファイルを右クリックして「名前の変更」を選ぶだけで、カンタンにファイル名を変更できますよね。
でも、黒い画面(CUI)が基本のLinuxでは、なぜ「Rename(リネーム)」専用の基本的なコマンドが存在しないで、「Move(移動)」を意味する mv を使うんでしょうか?
このギモンを解き明かす鍵は、Linuxがファイルをどうやって管理しているか、その根本的な仕組み(UNIX哲学っていう、ちょっとカッコイイ名前がついてます)にあるんです。
ファイルの実体(inode)と名前(ディレクトリ)は別物なんです
ちょっとだけ技術的なお話になりますが、Linuxのファイルシステムでは、ファイルの実体とその名前は、別々の場所で管理されてるんです。
1. ファイルの実体 (inode)
ファイルの中身(データそのもの)や、パーミッション(「誰が何をできるか」っていうルール)、所有者、作成日時みたいな「メタ情報」は、「inode(アイノード)」っていう管理番号(名札みたいなものですね)に紐付いてディスク上に保存されています。
これがファイルの実体です。
2. ファイル名 (ディレクトリ内のエントリ)
私たちが普段見ている「sample.txt」みたいなファイル名は、実は「ディレクトリ」っていう種類のファイルの中に保存されています。
ディレクトリは、「ファイル名」と「それに対応するinode番号」のリスト(電話帳みたいなもの)を、自分の中に持ってるんです。
私たちが ls コマンドを実行すると、Linuxは今いるディレクトリの「電話帳」を見て、「sample.txt っていう名前は inode 12345 番さんを指してますよー」って教えてくれる、っていう仕組みなんですね。
mv コマンドが「移動」と「名前変更」を兼ねる理由
この「inodeとファイル名は別」っていう仕組みを理解すると、mv コマンドの動きがよーく見えてきます。
mv コマンド(同じファイルシステム内での操作の場合)は、ファイルの実体(inode)には一切触らないんです!
mv がやってるのは、ディレクトリに記録されている「電話帳」のエントリを書き換えることだけなんですよ。
ケース1:ファイルを「移動」する場合
mv sample.txt /home/user/documents/
このコマンドは、Linuxの内部でこんな操作をしています。
1. 今いるディレクトリ(.)の電話帳から、「sample.txt -> inode 12345」っていう記述を削除します。
2. /home/user/documents/ ディレクトリの電話帳に、「sample.txt -> inode 12345」っていう記述を追加します。
ほら、実体(inode 12345)はディスク上の同じ場所から一歩も動いてませんよね?
ケース2:ファイルを「名前変更(リネーム)」する場合
mv sample.txt new_sample.txt
このコマンドは、こんな操作をしています。
1. 今いるディレクトリ(.)の電話帳から、「sample.txt -> inode 12345」っていう記述を削除します。
2. 今いるディレクトリ(.)の電話帳に、「new_sample.txt -> inode 12345」っていう記述を追加します。
💡 結論:なぜ mv なのか?
ご覧の通り、Linuxの内部処理から見れば、ファイルの「移動」も「名前変更」も、
「ディレクトリの電話帳(エントリ)を書き換える」
っていう点で、本質的にまったく同じ操作なんです!
これが、「linux 名前変更」 の基本コマンドが rename じゃなくて mv である理由なんですね。
mv は「ファイルの名前を移動する(付け替える)」コマンドである、って理解するとスムーズですよ🥰
mv コマンドによる基本的な linux ファイル名変更
「linux mv」 コマンドの本質が「名前の付け替え」だって理解できたところで、いよいよ実践的な「linux ファイル名変更」の方法を見ていきましょう!
mv の基本構文 (ファイル名変更)
「linux リネーム」 のための mv の基本構文は、すっごくシンプルです。
mv [オプション] [現在のファイル名] [新しいファイル名]
実行例: old.txt を new.txt に変更する
[user@server ~]$ ls -l -rw-r--r--. 1 user user 0 11月 13 09:00 old.txt
[user@server ~]$ mv old.txt new.txt
[user@server ~]$ ls -l -rw-r--r--. 1 user user 0 11月 13 09:00 new.txt
ls -l コマンドで確認すると、old.txt が消えて、代わりに new.txt が出現していることがわかりますね。
タイムスタンプやパーミッション、所有者は変わっていません。
これは、ファイルの実体(inode)はそのままに、名前(ディレクトリのエントリ)だけが old.txt から new.txt に変更されたっていう、確かな証拠なんです。
【重要】mv の安全な使い方:上書きの恐怖と必須オプション
mv コマンドはとっても強力ですが、使い方を間違えると取り返しのつかない事故につながっちゃいます…
mv コマンドによる「linux 名前変更」における最大のリスクは、「上書き」です。
mv のデフォルト動作は「警告なしの上書き」
もし、mv old.txt new.txt を実行したときに、new.txt っていうファイルが既に存在していたらどうなると思いますか…?
答えは「new.txt の中身は警告なしに消去され、old.txt の内容で上書きされる」です。
これ、すっごく危険ですよね!😱
苦労して作成した new.txt のデータが、タイプミスひとつで一瞬にして失われちゃうんです。
この危険を回避するために、以下のオプションを絶対に覚えてください!
(表1)mv コマンドの主要オプション(安全対策)
| オプション | ロングオプション | 説明 |
|---|---|---|
-i | --interactive | (最重要) 上書きが発生する場合、実行前に「overwrite 'new.txt'?」のように確認メッセージを表示します。y を押した場合のみ実行されます。 |
-n | --no-clobber | (安全) 上書きが発生する場合、何もしません(エラーにもならず、上書きをスキップします)。自動化スクリプトなんかで既存ファイルを絶対に消したくない場合に使います。 |
-f | --force | -i の逆で、確認メッセージを一切表示せず、強制的に上書きします。(危ないのであまり使わないでね!) |
-v | --verbose | (便利) 実行した処理('old.txt' -> 'new.txt' のような)を画面に表示します。何をリネームしたか確認したい場合に便利です。 |
【プロの推奨設定】エイリアスで mv を安全に
この危険な上書きを防ぐために、ほとんどのLinux熟練者さんは、mv コマンドを常に -i オプション付きで実行するように設定しています。
これを「エイリアス (alias)」って呼びます。
あなたのホームディレクトリにある設定ファイル(~/.bashrc や ~/.zshrc など)に、以下の1行を追記してみてください。
alias mv='mv -i'
この設定を追記して、シェルを再起動(または source ~/.bashrc を実行)すると、あなたがターミナルで mv って入力するたびに、Linuxは自動的に mv -i って解釈して実行してくれるようになるんです!
[user@server ~]$ mv old.txt new.txt mv: overwrite 'new.txt'?
たったこれだけで、意図しないファイルの上書き事故を劇的に減らすことができますよ!
ファイルを「移動」しつつ「名前変更」する合わせ技
mv コマンドが「名前の付け替え」であるっていう本質を理解していれば、「linux 名前変更」 と「移動」を同時に行うこともカンタンです。
mv [元の名前] [新しいディレクトリ/新しい名前]
実行例: report.txt を documents フォルダに final_report.txt として移動する
[user@server ~]$ ls documents/ report.txt
[user@server ~]$ mv report.txt documents/final_report.txt
[user@server ~]$ ls documents/
[user@server ~]$ ls documents/ final_report.txt
この操作も、Linuxにとっては「.(カレント)ディレクトリの電話帳から report.txt のエントリを削除して、documents/ ディレクトリの電話帳に final_report.txt っていう名前で同じinode番号のエントリを追加する」っていう、たった1つの mv 操作なんですよ。
mv コマンドによるディレクトリの linux 名前変更
「linux 名前変更」 はファイルだけに限りません!
mv コマンドは、ディレクトリの名前変更にも、まったく同じ構文で使えちゃいます。
mv [現在のディレクトリ名] [新しいディレクトリ名]
実行例: photos_old を photos_new に変更する
[user@server ~]$ ls -ld photos_old/ drwxr-xr-x. 2 user user 4096 11月 13 09:10 photos_old/
[user@server ~]$ mv photos_old photos_new
[user@server ~]$ ls -ld photos_new/ drwxr-xr-x. 2 user user 4096 11月 13 09:10 photos_new/
ファイルの場合と同じように、ディレクトリ名が即座に変更されます。
中身のファイルが何万個あっても、inode(ディレクトリの実体)を操作するわけじゃなくて、親ディレクトリ(この場合は ~)の電話帳にある名前を付け替えるだけなので、この操作は一瞬で完了するんですよ。
【最重要・警告】ディレクトリ名を mv する際の「最大の罠」
ファイルの「linux ファイル名変更」では上書きが最大の罠でしたけど、ディレクトリの場合はさらに深刻で、意味がまったく変わっちゃう「マージ(移動)の罠」が存在するんです…
mv dirA dirB を実行したときの動きは、dirB が存在するかどうかで完全に異なります!
ケース1: dirB が存在しない場合(期待通りのリネーム)
[user@server ~]$ ls -F dirA/
[user@server ~]$ mv dirA dirB
[user@server ~]$ ls -F dirB/
これは期待通りですよね!
dirA が dirB っていう名前にリネームされました。
ケース2: dirB が既に存在する場合(危険なマージ・移動)
[user@server ~]$ ls -F dirA/ dirB/
[user@server ~]$ mv dirA dirB
このコマンドを実行すると、dirA は dirB にリネームされるでしょうか…?
いいえ、違います!!
dirB が既に存在する場合、mv コマンドは「dirA を dirB の中に移動しろ」っていう命令として解釈されちゃうんです!
[user@server ~]$ ls -F dirB/
[user@server ~]$ ls -F dirB/ dirA/
結果は dirB/dirA っていう階層構造になっちゃいます。
これは、ファイル名を変更したかっただけなのに、意図せずディレクトリ構造全体をグチャグチャにしかねない、すっごく危険な挙動です。
結論(絶対のお約束!)
ディレクトリ名を mv で変更する前には、
必ず ls コマンドで変更先の名前が既に存在しないかを確認する癖をつけましょう!
(ちなみに、mv -i のエイリアスを設定していても、この「ディレクトリの中への移動」は上書きじゃないので、警告は表示されません…。これがファイルの上書きより厄介な点なんです💦)
【上級編】rename コマンドによる高度な一括 linux リネーム
mv コマンドは、「linux 名前変更」 の基本ですが、万能じゃありません。
mv が苦手なこと、それは「複数のファイル」を「一度に」名前変更することです。
例えば、今いるディレクトリにあるすべての .txt ファイルの拡張子を .bak に変更したい!って思って、こんな風に実行したとします。
mv *.txt *.bak
これは期待通りに動きません😥
シェル(Bashとか)は *.txt を file1.txt file2.txt file3.txt みたいに展開しますけど、最後の引数 *.bak はそのまま *.bak っていう文字列として mv に渡されちゃいます。
mv は最後の引数を「移動先のディレクトリ」って解釈しようとするので、「*.bak っていうディレクトリは存在しませんよ!」っていうエラー(mv: target ‘*.bak’ is not a directory)になっちゃうんです。
こんな、めんどくさい一括「linux リネーム」 を行いたい場合に登場するのが、rename コマンドなんです!
rename コマンドの「2つのバージョン」に注意!
rename コマンドを解説する上で、最も重要なE-E-A-T(経験・専門性)に関わる情報があります。
それは、Linuxのディストリビューションによって、rename っていう名前のコマンドの実体が、まったく異なる2つのバージョン(util-linux 版と Perl版)が存在する、っていうことです!
- Debian / Ubuntu / Linux Mint 系:
rename コマンドは、デフォルトで Perl版 (prename) であることが多いです。
Perlの強力な正規表現を使ってリネーム操作を行います。(ちょっと難しいけど超強力!) - RHEL / CentOS / Rocky Linux / AlmaLinux / Fedora 系:
rename コマンドは、デフォルトで util-linux 版です。
単純な「文字列の置換」だけを行います。(カンタン!)
あなたのシステムがどっちの rename かを調べるには、man rename を実行してマニュアルを確認するか、以下のコマンドで実体を見てみるのが早いですよ。
[user@server ~]$ ls -l $(which rename)
例: /usr/bin/rename -> /etc/alternatives/rename -> /usr/bin/prename
こんな風に prename にリンクされてれば Perl版です。
この記事では、両方のバージョンの使い方をちゃんと解説しますね。
使い方1: util-linux 版 rename (シンプルな文字列置換)
RHEL系で標準の、シンプルな rename コマンドです。カンタンですよ!
構文:
rename [変更前の文字列] [変更後の文字列] [対象のファイル群]
実行例
▼ 拡張子 .txt を .bak に変更する
# 変更前: file1.txt, file2.txt rename .txt .bak *.txt
変更後: file1.bak, file2.bak
(注意!)この rename は、ファイル名の中で最初に見つかった .txt だけを置換します。file.txt.txt は file.bak.txt になっちゃうので、そこだけ気をつけてくださいね。
▼ ファイル名の image_ を photo_ に変更する
# 変更前: image_001.jpg, image_002.jpg rename image_ photo_ image_*.jpg
変更後: photo_001.jpg, photo_002.jpg
とってもシンプルで直感的ですが、複雑な置換はできません。
使い方2: Perl版 rename (prename) (正規表現による強力な置換)
Debian/Ubuntu系で標準の、すっごく強力な rename コマンドです。
Perlの正規表現(s/検索/置換/)っていうのを使って、複雑な「linux リネーム」 を実行できます。
構文:
rename 's/[検索パターン]/[置換後文字列]/[オプション]' [対象のファイル群]
s/は「置換(substitute)」を意味するおまじないだと思ってください。- 末尾の
/の後に、g(見つかったものすべてを置換)やi(大文字小文字を区別しない)などのオプションを付けられます。
実行例
▼ 拡張子 .txt を .bak に変更する
$ は「行末(この場合はファイル名の末尾)」を意味する正規表現です。
# 変更前: file1.txt, memo.txt.txt rename 's/\.txt$/.bak/' *.txt
変更後: file1.bak, memo.txt.bak
$ を使ったので、最後の .txt だけが正しく置換されます!賢い!
▼ すべてのファイル名の大文字を小文字に統一する
y/ は「変換(transliterate)」を意味します。
# 変更前: FILE_A.JPG, Document-B.PDF rename 'y/A-Z/a-z/' *
変更後: file_a.jpg, document-b.pdf
▼ すべての .jpg ファイルにプレフィックス(接頭辞) prefix_ を追加する
^ は「行頭(ファイル名の先頭)」を意味します。
# 変更前: photo1.jpg, photo2.jpg rename 's/^/prefix_/' *.jpg
変更後: prefix_photo1.jpg, prefix_photo2.jpg
Perl版 rename はすっごく強力ですが、正規表現の知識がちょっと必要になりますね。
rename を安全に使うための必須オプション: -n (ドライラン)
rename コマンド、特にPerl版は、正規表現をちょっと間違えるだけで、意図しない大量のファイルを破壊的にリネームしちゃう可能性があります(こわい!)。
そこで、rename を実行する前には、必ず -n (--no-act または --dry-run) オプションを付けてください!
-n オプションは「ドライラン」を意味して、実際のリネームは一切行わず、「もし実行したらどうなるか」っていうプレビューだけを表示してくれます。これ、すっごく大事です!
実行例: ドライランで安全確認
[user@server ~]$ ls file1.txt file2.txt
まず -n を付けて実行
[user@server ~]$ rename -n 's/.txt$/.bak/' *.txt rename(file1.txt, file1.bak) rename(file2.txt, file2.bak)
プレビュー結果が正しいことを確認
[user@server ~]$ ls file1.txt file2.txt
(まだ変更されてませんね)
確認できたら、-n を外して本実行
[user@server ~]$ rename 's/.txt$/.bak/' *.txt
[user@server ~]$ ls file1.bak file2.bak
この -n での事前確認は、rename コマンドを使う上での鉄則ですよ!
find や for ループを使った究極の一括 linux 名前変更
「rename コマンドがインストールされてない…」「rename の正規表現でも対応できないほど複雑なリネームがしたい!」
そんな場合は、シェルの for ループや find コマンドを mv と組み合わせて使います。
これは「linux リネーム」 の最終手段であり、最も強力な方法です!
for ループと mv を組み合わせる
シェルの for ループを使うと、ファイル一つひとつに対して mv コマンドを実行できます。
実行例: .txt を .bak に変更する
# まずは echo で実行内容を確認(ドライランですよ!) [user@server ~]$ for f in *.txt; do echo mv "f""{f%.txt}.bak"; done mv file1.txt file1.bak mv file2.txt file2.bak
確認後、echo を外して本実行
[user@server ~]$ for f in *.txt; do mv "f""{f%.txt}.bak"; done
"$f": ファイル名にスペースが含まれていても正しく扱うため、変数は必ずダブルクォート(`”`)で囲みます。これ大事!${f%.txt}: シェルの「パラメータ展開」っていう便利な機能です。「変数 $f の末尾から .txt っていう文字列を最短で削除する」っていう意味で、file1.txt が file1 になります。
(表2)for ループで役立つシェルのパラメータ展開
for ループでのリネームには、このパラメータ展開の知識が欠かせません。よく使うものだけまとめますね!
| 構文 | 説明 | 例 (f="path/to/file.txt") | 結果 | ||||
|---|---|---|---|---|---|---|---|
${f##*/} | 先頭から最後の / までを削除 | ${f##/} | file.txt (basename) | ||||
${f%/} | 末尾から最初の / までを削除 | ${f%/*}\\ \\ (dirname)\ \ \{f%.*} | 末尾から最初の . までを削除 | ${f%.\*}\\ \\\ \ \{f/pattern/string} | pattern を string に置換 | ${f/file/document} | path/to/document.txt |
find コマンドと mv を組み合わせる(再帰的リネーム)
サブディレクトリのずーっと奥深くにあるファイルまですべて、再帰的に「linux 名前変更」 したい場合、find コマンドの出番です!
実行例: すべての .jpeg を .jpg に変更する
find の -exec オプションは強力ですが、mv みたいな2つの引数を取るコマンドとの連携はちょっと複雑なんです…
よくある間違いはこんな感じです。
# これは期待通りに動かない(エラーになる) find . -type f -name "*.jpeg" -exec mv {} {}.jpg ;
{}.jpg っていう書き方は解釈してくれないので、sh -c っていうのを使って、見つかったファイルごとに個別のシェルを起動するのがプロの定石です。
# まずは echo で確認(ドライラン) find . -type f -name "*.jpeg" -exec sh -c 'echo mv "$0" "${0%.jpeg}.jpg"' {} ;
確認後、echo を外して本実行
find . -type f -name "*.jpeg" -exec sh -c 'mv "$0" "${0%.jpeg}.jpg"' {} ;
-exec sh -c '...' {} ;: find で見つかった各ファイル({})を引数($0)として、sh -c '...'の中のコマンドを実行します。${0%.jpeg}.jpg: find から渡されたファイルパス($0)の末尾の.jpegを.jpgに置き換えています。
この find と sh -c の組み合わせをマスターすれば、「linux 名前変更」 でできないことは、ほぼなくなりますよ!
まとめ
「linux 名前変更」っていうシンプルな操作の裏には、Linuxのファイルシステムの深い仕組みと、状況に応じた多彩なコマンドの使い分けがありましたね。
最後に、この記事で学んだ最重要ポイントを、もう一度おさらいします!
✅ 基本は mv コマンド!
「linux 名前変更」 の基本は「linux mv」 コマンドです。
mv [元] [新] って実行します。
✅ mv の本質は「名前の付け替え」!
Linuxでは「移動」と「リネーム」は、ディレクトリの「電話帳(エントリ)」を書き換えるっていう点で、本質的に同じ操作なんです。
だから mv が両方の役割を担ってるんですね。
✅ 安全対策(mv -i)を絶対に忘れない!
mv はデフォルトで「警告なしの上書き」をしちゃいます(こわい!)。
alias mv='mv -i' を .bashrc に設定して、常に確認(interactive)モードで動かすことを、強く強く推奨します!
✅ ディレクトリの mv は「マージの罠」に注意!
mv dirA dirB を実行したとき、dirB が存在すると、リネームじゃなくて dirB/dirAっていう「移動」になっちゃうので、気をつけてくださいね。
✅ 一括リネームは rename コマンド!
複数のファイルを一括で「linux リネーム」 するには rename コマンドが便利です。
ただし、ディストリビューションによって「シンプルな置換版」と「Perl正規表現版」の2種類があるので注意が必要です。
実行する前には、必ず -n(ドライラン)オプションでプレビューを確認しましょう!
✅ 最終手段は for と find!
rename でも対応できない複雑な一括変更は、for ループや find コマンドと mv を組み合わせて実行します。
ファイルやディレクトリの名前変更は、Linux管理の本当に第一歩です。
mv の安全な使い方をマスターして、必要に応じて rename や find を使いこなすことで、あなたのサーバー管理スキルは確実に一段階レベルアップしますから!💪✨


コメント