「ディレクトリ名を変えたいけど、移動先を別途作るのが面倒」
Linuxでファイルやディレクトリを移動・リネームするには
mv(move)コマンドを使います。この記事では、
mv コマンド の実践的な使い方を解説します。cp との仕組みの違い(inode付け替えで瞬時に移動する仕組み)から、上書き防止オプション(-i / -n)、バックアップ付きの安全な移動(-b / -S)、find との組み合わせによる条件付き一括移動まで網羅しました。この記事のポイント
・mv は移動(元ファイルが消える)とリネーム(名前変更)の両方に使えるコマンド
・同一ファイルシステム内の移動は inode の付け替えだけで完了するため、数GBでも一瞬
・-i で上書き確認、-n で上書き禁止、-b と -S で拡張子指定付き自動バックアップが設定できる
・find との組み合わせで更新日時・サイズなど条件付き一括移動が可能
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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
3. 複数ファイルをまとめて移動する
複数のファイルを一度に移動する場合は、最後の引数にディレクトリを指定します。ワイルドカード(*)を使えばさらに効率的です。# 複数ファイルを個別に指定して移動する $ mv file1.txt file2.txt file3.txt /tmp/backup/ # ワイルドカードで .log ファイルをまとめて移動する $ mv *.log /var/log/archive/
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ユーザーの
.bashrc に alias 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
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
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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:tailコマンドでログ監視する方法|tail -fの使い方やgrep連携も
- 前のページへ:lsコマンドのオプション一覧|Linux基本コマンドリファレンス
- この記事の属するカテゴリ:Linuxtipsへ戻る

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