mvコマンドでファイルを移動・リネームする方法|上書き防止や一括変更も

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > mvコマンドでファイルを移動・リネームする方法|上書き防止や一括変更も
「あのファイル、どこに置いたっけ?」と思ったら気づいた。移動したつもりが、コピーして元ファイルが残っていた。
「ディレクトリ名を変えたいけど、移動先を別途作るのが面倒」
Linuxでファイルやディレクトリを移動・リネームするには mv(move)コマンドを使います。

この記事では、mv コマンド の実践的な使い方を解説します。
cp との仕組みの違い(inode付け替えで瞬時に移動する仕組み)から、上書き防止オプション(-i / -n)、バックアップ付きの安全な移動(-b / -S)、find との組み合わせによる条件付き一括移動まで網羅しました。

この記事のポイント

・mv は移動(元ファイルが消える)とリネーム(名前変更)の両方に使えるコマンド
・同一ファイルシステム内の移動は inode の付け替えだけで完了するため、数GBでも一瞬
・-i で上書き確認、-n で上書き禁止、-b と -S で拡張子指定付き自動バックアップが設定できる
・find との組み合わせで更新日時・サイズなど条件付き一括移動が可能


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

mvコマンドとは?(cpとの違い・仕組み)

mv は「move」の略で、ファイルやディレクトリを移動する、または名前を変更(リネーム)するコマンドです。

cpコマンドとの大きな違いは、mvは元ファイルが残らないという点です。cpは「コピー」なので元ファイルがそのまま残りますが、mvは移動なので元の場所からファイルがなくなります。また、ディレクトリを移動する場合も mv だけでOKで、cp のように -r オプションは不要です。

もう一つ知っておくべき重要なポイントがあります。同じファイルシステム(パーティション)内でmvを実行すると、実際にはデータのコピーは行われず、inode(ファイルの管理情報)の参照先を付け替えるだけで完了します。そのため、数GBの巨大なファイルでも一瞬で移動が完了します。

一方、異なるファイルシステムをまたぐ移動(例:/home から /tmp が別パーティションの場合)では、内部的にはコピー+削除が行われるため、ファイルサイズに比例して時間がかかります。

基本的な使い方

1. ファイルを別のディレクトリに移動する

最も基本的な使い方です。移動先にディレクトリを指定すると、そのディレクトリ内にファイルが移動します。

# 基本書式: mv [移動元ファイル] [移動先ディレクトリ] # sample.txt を /tmp/ ディレクトリに移動する $ mv sample.txt /tmp/

2. ファイル名を変更する(リネーム)

移動先にファイル名を指定すると、ファイル名の変更になります。同一ディレクトリ内で実行すると純粋なリネームになります。

# old.txt を new.txt にリネームする $ mv old.txt new.txt

実際のサーバーで動作を確認してみましょう。

[admin@sv01 ~]$ ls access.log report.txt [admin@sv01 ~]$ mv report.txt report_20260613.txt [admin@sv01 ~]$ ls access.log report_20260613.txt

元の「report.txt」が「report_20260613.txt」に変わり、コピーとは違って元ファイルは残りません。

3. 複数ファイルをまとめて移動する

複数のファイルを一度に移動する場合は、最後の引数にディレクトリを指定します。ワイルドカード(*)を使えばさらに効率的です。

# 複数ファイルを個別に指定して移動する $ mv file1.txt file2.txt file3.txt /tmp/backup/ # ワイルドカードで .log ファイルをまとめて移動する $ mv *.log /var/log/archive/

注意点として、複数ファイルを指定する場合は最後の引数を必ずディレクトリにする必要があります。ファイル名を最後に指定すると「mv: ターゲット 'xxx' はディレクトリではありません」というエラーになります。

4. ディレクトリを移動する

ディレクトリの移動もファイルと同じ書式です。cpのように -r オプションは不要です。

# mydir ディレクトリを /opt/ 配下に移動する $ mv mydir /opt/

ここで注意が必要なのは、移動先パスが既存のディレクトリかどうかで挙動が変わる点です。

# ケース1: /opt/newdir が存在しない場合 $ mv mydir /opt/newdir # 結果: mydir が newdir という名前にリネームされる(/opt/newdir/ になる) # ケース2: /opt/newdir が既に存在する場合 $ mv mydir /opt/newdir # 結果: /opt/newdir/mydir/ として中に入れられる

ls コマンドで移動先の存在を事前に確認してから実行する習慣をつけましょう。

実務で必須のオプション

1. -i(上書き前に確認する)

移動先に同名のファイルがある場合、mvはデフォルトでは何も聞かずに上書きします。これが事故の原因になるため、-i(interactive)オプションで上書き前に確認プロンプトを表示させるのが安全です。

# 上書き前に確認する $ mv -i sample.txt /tmp/ mv: overwrite '/tmp/sample.txt'? y

y を入力すると上書き、n を入力するとキャンセルされます。

※多くのLinuxディストリビューション(RHEL系など)では、rootユーザーの .bashrcalias mv='mv -i' がデフォルトで設定されています。そのため、rootでは自動的に確認が出ますが、一般ユーザーやスクリプト内では設定されていない場合があるので、明示的に -i を付けるのが確実です。

一般ユーザーでも常に確認を求めたい場合は、~/.bashrc に以下を追記して設定を反映させます。

# ~/.bashrc に追記 alias mv='mv -i' # 設定を反映 source ~/.bashrc

2. -f(強制的に上書きする)

-f(force)オプションを指定すると、確認なしで強制的に上書きします。前述の alias mv='mv -i' が設定されている環境で、スクリプトなどから確認なしで実行したい場合に使います。

# 確認なしで強制的に上書きする $ mv -f old_config.conf /etc/myapp/config.conf

3. -n(上書きしない)

-n(no-clobber)オプションを指定すると、移動先に同名ファイルが存在する場合、上書きせずにスキップします。「既存のファイルを絶対に消したくない」場面で重宝します。

# 移動先に同名ファイルがあっても上書きしない $ mv -n newfile.txt /tmp/

移動が行われたかどうかのメッセージも出ないため、-v(後述)と組み合わせると確認しやすいです。

4. -v(処理内容を表示する)

-v(verbose)オプションを付けると、どのファイルがどこに移動されたかを表示してくれます。大量のファイルを移動する際や、スクリプトのデバッグ時に役立ちます。

# 移動内容を表示する $ mv -v *.log /var/log/archive/ renamed 'access.log' -> '/var/log/archive/access.log' renamed 'error.log' -> '/var/log/archive/error.log'

5. -u(新しい場合のみ移動する)

-u(update)オプションは、移動元のファイルが移動先のファイルよりも新しい場合にのみ移動を実行します。古いファイルで新しいファイルを上書きしてしまう事故を防げます。

# 移動元が新しい場合のみ移動する $ mv -u updated_config.conf /etc/myapp/config.conf

6. -b(バックアップを作成して移動する)

-b(backup)オプションは、移動先に同名ファイルがある場合、上書きする前に既存ファイルのバックアップ(末尾に が付いたファイル)を自動作成します。

# 上書き前にバックアップを自動作成する $ mv -b newfile.txt /tmp/newfile.txt # /tmp/ に newfile.txt~ というバックアップが作られる $ ls /tmp/newfile* /tmp/newfile.txt /tmp/newfile.txt~

7. -S(バックアップの拡張子を指定する)

-b オプションのバックアップファイル名はデフォルトで「元のファイル名 + 」になりますが、-S(suffix)オプションで任意の拡張子に変更できます。

# バックアップの拡張子を .bak に変更して移動する $ mv -b -S .bak new_report.txt /var/backup/report.txt # 既存の report.txt が report.txt.bak にリネームされてから上書きされる $ ls /var/backup/ report.txt report.txt.bak

本番環境の設定ファイルを更新する際は mv -b -S .bak 新ファイル 設定ファイル のパターンが安全です。バックアップファイル名が明確になり、 よりも管理しやすくなります。

応用・実務Tips

1. 日付付きバックアップを作成するリネーム

サーバー運用では、設定ファイルを編集する前に「元に戻せるようにバックアップを取る」のが鉄則です。日付付きのファイル名にリネームしておけば、いつ時点のバックアップかが一目でわかります。

# httpd.conf を日付付きファイル名でバックアップする $ mv /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.$(date +%Y%m%d) # 結果を確認する $ ls /etc/httpd/conf/httpd.conf* /etc/httpd/conf/httpd.conf.20260312

※この方法は「バックアップを取ってから新しいファイルを配置する」運用で使います。mvで元ファイルがなくなるため、必要に応じて新しいhttpd.confを別途コピーしてください。

2. cpではなくmvを使うべき場面

同じファイルシステム内でファイルを「移動」する場合、cpで「コピー+元ファイル削除」をするよりも、mvを使う方が圧倒的に高速です。

前述の通り、mvはinode(ファイルの管理情報)の付け替えだけで完了するため、10GBのファイルでも一瞬で完了します。cpの場合はデータの実コピーが発生するため、ファイルサイズに比例して時間がかかります。

mv を使う場面:元ファイルが不要な移動・リネーム
cp を使う場面:元ファイルを残したいコピー・バックアップ

3. renameコマンドで複数ファイルを一括リネームする

mvコマンドは1回の実行で1つのファイルしかリネームできません。「拡張子を一括で変更したい」「ファイル名のパターンを一括で置換したい」場合は、rename コマンドが便利です。

RHEL系(AlmaLinux、Rocky Linux等)には rename コマンドが標準でインストールされています(util-linux版)。

# 基本書式: rename [置換前] [置換後] [対象ファイル] # .log を .log.bak に一括変更する $ rename .log .log.bak *.log # 結果を確認する $ ls *.bak access.log.bak error.log.bak app.log.bak

※RHEL系の rename は単純な文字列置換です。Debian/Ubuntu系の rename(Perl版)とは書式が異なるため注意してください。どちらのバージョンか確認するには rename --version を実行します。Perl版なら正規表現が使えます。

forループを使ってmvで一括リネームする方法もあります。

# for ループで .txt を .txt.bak に一括リネームする $ for f in *.txt; do mv "$f" "${f}.bak"; done

4. findとの組み合わせで条件付き一括移動する

ワイルドカードでは指定できない条件(更新日時・ファイルサイズなど)でファイルを選んで移動したい場合は、find コマンドと組み合わせます。

# 30日以上更新されていない .log ファイルを /var/log/archive/ に移動する $ find /var/log/ -name "*.log" -mtime +30 -exec mv {} /var/log/archive/ \; # 1MB 以上のファイルを移動する $ find /home/admin/ -size +1M -exec mv {} /var/backup/ \; # 実行前に対象ファイルを確認したい場合(echo を挟む) $ find /var/log/ -name "*.log" -mtime +30 -exec echo mv {} /var/log/archive/ \;

find ... -exec mv {} /移動先/ \; のパターンは実務で非常に役立ちます。本番実行前に echo を挟んで移動対象を確認する習慣をつけましょう。

トラブルシュート・エラー対処

1. 「Permission denied」が出た時の対処法

移動元ファイルの読み取り権限、または移動先ディレクトリの書き込み権限がない場合に発生します。

# エラー例 $ mv /etc/hosts /tmp/ mv: cannot move '/etc/hosts' to '/tmp/hosts': Permission denied

対処法は、sudo を付けて実行するか、移動先ディレクトリの権限を確認することです。

# sudo を付けて実行する $ sudo mv /etc/hosts /tmp/ # 移動先ディレクトリの権限を確認する $ ls -ld /tmp/ drwxrwxrwt. 10 root root 4096 Mar 12 10:00 /tmp/

2. 「Directory not empty」が出た時の対処法

移動先に同名のディレクトリが既に存在し、かつそのディレクトリが空でない場合に発生します。

# エラー例 $ mv mydir /opt/mydir mv: cannot move 'mydir' to '/opt/mydir': Directory not empty

対処法は、移動先のディレクトリを事前に削除するか、別の名前で移動することです。

# 移動先のディレクトリを削除してから移動する $ rm -rf /opt/mydir $ mv mydir /opt/ # または、別の名前で移動する $ mv mydir /opt/mydir_new

3. 「are the same file」が出た時の対処法

移動元と移動先が同じファイルを指している場合に発生します。ハードリンクやシンボリックリンクが絡んでいるときに起こりやすいエラーです。

# エラー例 $ mv file.txt file.txt mv: 'file.txt' and 'file.txt' are the same file

移動元と移動先のパスが実際に異なるか、ls -li でinode番号を確認してください。

4. スペースを含むファイル名でエラーになった時の対処法

ファイル名にスペースが含まれていると、コマンドが意図しない形に分割されてエラーになります。

# エラー例: "my report 2026.txt" をそのまま書くと3つの引数に分かれる $ mv my report 2026.txt /var/backup/ mv: cannot stat 'my': No such file or directory # 対処法: ダブルクォートで囲む $ mv "my report 2026.txt" /var/backup/ # find と xargs の組み合わせ(-print0 と -0 でスペース対応) $ find . -name "*.txt" -print0 | xargs -0 -I{} mv {} /var/backup/

ファイル名はダブルクォートで囲む習慣をつけておくと、スペースや特殊文字による予期せぬエラーを防げます。

for 文と mv で複数ファイルを一括リネームする|rename・xargs との使い分け

「mv リネーム 複数」で辿り着く方は、mv old new を10回20回繰り返す手作業を避けたい段階だと思います。mv 自体には複数ファイルを一括変換する機能はありませんが、for 文や rename コマンド、xargs と組み合わせれば1行で済みます。

# for 文で .log を .log.bak に一括リネーム(最も汎用的)
$ for f in *.log; do mv "$f" "${f}.bak"; done

# 連番のファイル名を変える(apple1 → orange1 …)
$ for n in 1 2 3 4 5; do mv "apple${n}" "orange${n}"; done

# rename コマンドで拡張子を一括変換(util-linux 版と Perl 版で文法が違う点に注意)
# util-linux 版(CentOS/RHEL/AlmaLinux 標準)
$ rename .txt .md *.txt

# Perl 版(Debian/Ubuntu 標準・正規表現が使える)
$ rename 's/\.txt$/.md/' *.txt

大量のファイル名を sed で加工してから mv に渡したいときは xargs -I が便利です。

# 接頭辞 old_ を new_ に置換する
$ ls old_*.csv | sed 's/^old_/new_/' | \
    paste -d ' ' <(ls old_*.csv) - | \
    xargs -n 2 mv

# あるいは for 文で書く(こちらの方が読みやすい)
$ for f in old_*.csv; do mv "$f" "${f/#old_/new_}"; done

私も rename コマンドを util-linux と Perl のどちらの文法で書けばよいか分からなくなって手が動かなくなった時期がありました。判別法は rename --version です。Perl 版なら正規表現が出てきて、util-linux 版なら util-linux の表記が出ます。本番で初見の環境を触るときは、まず --version でどちらか確認する習慣を付けると安全です。

本記事のまとめ(mvコマンド早見表)

やりたいこと コマンド
ファイルを移動する mv ファイル名 移動先ディレクトリ
ファイル名を変更する mv 旧ファイル名 新ファイル名
複数ファイルをまとめて移動する mv ファイル1 ファイル2 移動先ディレクトリ
上書き前に確認する mv -i ファイル名 移動先
強制的に上書きする mv -f ファイル名 移動先
上書きしない(スキップ) mv -n ファイル名 移動先
処理内容を表示する mv -v ファイル名 移動先
新しい場合のみ移動する mv -u ファイル名 移動先
バックアップを作成して移動する mv -b ファイル名 移動先
バックアップの拡張子を指定する mv -b -S .bak ファイル名 移動先
日付付きバックアップを作成する mv ファイル名 ファイル名.$(date +%Y%m%d)
条件付き一括移動(更新日時・サイズ等) find /パス -条件 -exec mv {} /移動先/ \;
拡張子を一括変更する rename .log .log.bak *.log

mvコマンドで上書き事故を起こさず安全に運用できていますか?

コマンドの使い方を一つひとつ覚えていくのは時間がかかります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。