mvコマンドの使い方:ファイル移動とリネームの実践ガイド

概要

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

現場での重要性: デプロイ時のファイル配置、ログローテーション、古いファイルのアーカイブ移動など、運用作業で頻繁に使用します。適切なオプションを知らないと、既存ファイルを誤って上書きしてデータを失ったり、権限やタイムスタンプが意図せず変更されたり、ディレクトリ構造を壊してしまうリスクがあります。逆に、mvを正確に使いこなすことで、ファイル管理やデプロイ作業の効率が向上します。


基本コマンド・構文

ファイルのリネーム(名前変更)

mv old_name.txt new_name.txt

実行例:

$ ls
config.ini

$ mv config.ini settings.ini
$ ls
settings.ini

元のconfig.inisettings.iniにリネームされます。元のファイルは残りません。

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

mv file.txt /path/to/destination/

実行例:

$ ls
report.txt

$ mv report.txt /backup/
$ ls
# report.txt は消えている

$ ls /backup/
report.txt

ディレクトリのリネーム

mv old_directory new_directory

実行例:

$ ls
myapp/

$ mv myapp myapp_v2
$ ls
myapp_v2/

現場で必須のオプション・設定

1. mv -i:上書き前に確認

mv -i source.txt destination.txt

実行例:

$ ls
file.txt  backup.txt

$ mv -i file.txt backup.txt
mv: overwrite 'backup.txt'? y

実務での活用理由: 既に存在するファイルを誤って上書きすることを防ぎます。本番環境や重要なファイルを扱う際は必須です。エイリアスでmvmv -iに設定しておくことを強く推奨します。

# .bashrc に追記
alias mv='mv -i'

2. mv -n:既存ファイルを上書きしない

mv -n source.txt destination.txt

実行例:

$ ls
file.txt  backup.txt

$ mv -n file.txt backup.txt
# backup.txt が既に存在するため、何もしない(エラーも出ない)

$ ls
file.txt  backup.txt

実務での活用理由: スクリプト内で、既に存在するファイルを保護したい場合に有効です。-iと異なり、対話的な確認なしで上書きを防げます。バックアップスクリプトで、既存のバックアップを残したまま新しいバックアップを作成する際に使用します。

3. mv -v:実行内容を表示(冗長モード)

mv -v file.txt /backup/

実行例:

$ mv -v config.ini /backup/
renamed 'config.ini' -> '/backup/config.ini'

実務での活用理由: スクリプトのデバッグやログ出力で、どのファイルが移動されたかを明示的に確認できます。複数のファイルを一括移動する際、処理の進行状況を追跡するのに有効です。

4. mv -u:移動先が古い場合のみ移動

mv -u source.txt destination.txt

実行例:

$ ls -l
-rw-r--r-- 1 user user 1234 Jan 30 10:00 source.txt
-rw-r--r-- 1 user user 5678 Jan 29 09:00 destination.txt

$ mv -u source.txt destination.txt
# source.txt の方が新しいので、移動される

$ ls
destination.txt

実務での活用理由: 定期的なファイル同期や更新処理で、新しいファイルのみを移動することで、無駄な処理を省けます。ただし、完全な同期にはrsyncの方が適しています。

5. 複数ファイルの一括移動

mv file1.txt file2.txt file3.txt /destination/

実行例:

$ mv config.ini settings.yaml app.conf /backup/
$ ls /backup/
config.ini  settings.yaml  app.conf

実務での活用理由: 複数の設定ファイルやログファイルを一度にアーカイブディレクトリに移動する際、一行のコマンドで完結します。


実践的なユースケース(逆引きレシピ)

ケース1:古いログファイルをアーカイブディレクトリに移動

7日以上前のログファイルをアーカイブ:

find /var/log/myapp -name "*.log" -mtime +7 -exec mv {} /archive/logs/ \;

実行例:

$ find /var/log/myapp -name "*.log" -mtime +7 -exec mv {} /archive/logs/ \;
$ ls /archive/logs/
app.log.20260120  app.log.20260121  app.log.20260122

ケース2:ファイル名を一括でリネーム(拡張子変更)

.txtファイルを.bakに一括変更:

for file in *.txt; do
  mv "$file" "${file%.txt}.bak"
done

実行例:

$ ls
file1.txt  file2.txt  file3.txt

$ for file in *.txt; do mv "$file" "${file%.txt}.bak"; done
$ ls
file1.bak  file2.bak  file3.bak

ケース3:デプロイ時の旧バージョン退避

新バージョンをデプロイする前に、旧バージョンを退避:

mv /var/www/myapp /var/www/myapp.old
mv /tmp/myapp_new /var/www/myapp

実行例:

$ mv /var/www/myapp /var/www/myapp.old
$ mv /tmp/myapp_new /var/www/myapp
$ ls /var/www/
myapp  myapp.old

ロールバックが必要な場合は、逆の操作で元に戻せます。

ケース4:ワイルドカードで特定のファイルを移動

.logファイルだけをログディレクトリに移動:

mv /tmp/*.log /var/log/myapp/

実行例:

$ mv /tmp/*.log /var/log/myapp/
$ ls /var/log/myapp/
access.log  error.log  debug.log

ケース5:日付付きでファイルをリネーム

設定ファイルを日付付きでバックアップ:

mv config.ini config.ini.$(date +%Y%m%d_%H%M%S)

実行例:

$ mv config.ini config.ini.$(date +%Y%m%d_%H%M%S)
$ ls
config.ini.20260130_113000

シニアエンジニアの知恵(Expert Advice)

1. mv は元のファイルを削除する

mvはコピーではなく移動なので、元の場所からファイルが消えます。重要なファイルを扱う場合、移動前にcpでバックアップを取ることを推奨します。

# 安全な方法
cp -p important_file important_file.bak
mv important_file /new/location/

2. 同じファイルシステム内ではi-nodeが保持される

同じファイルシステム内でのmvは、i-nodeを変更せず、ディレクトリエントリのみを変更します。これにより、大容量ファイルでも瞬時に移動できます。

# 同じファイルシステム内(高速)
mv /var/data/largefile.dat /var/archive/

# 異なるファイルシステム間(コピー→削除になるため遅い)
mv /var/data/largefile.dat /mnt/external/

異なるファイルシステム間では、内部的にコピー→削除が実行されるため、時間がかかります。

3. -i オプションをデフォルトにする

誤った上書きを防ぐため、エイリアスでmv -iを設定してください。

# .bashrc または .zshrc に追記
alias mv='mv -i'

スクリプト内でエイリアスを無効化する場合は、\mvを使用します。

\mv file.txt /backup/  # エイリアスを無視

4. ディレクトリ移動時の末尾スラッシュに注意

移動先のパス指定で、末尾に/があるかないかで挙動が変わります。

# destination/ が存在する場合
mv source destination/
# 結果: destination/source/ が作成される

mv source destination
# 結果: source が destination にリネームされる

意図しない動作を防ぐため、移動先のパスは明示的に指定してください。

5. ファイル名にスペースが含まれる場合の注意

ファイル名にスペースが含まれる場合、必ずダブルクォートで囲んでください。

mv "My Document.txt" "My Important Document.txt"

スクリプト内で変数を使う場合も、クォートを忘れずに:

FILE="My Document.txt"
mv "$FILE" /backup/

6. 本番環境での移動前の確認

本番環境で重要なファイルを移動する前に、必ず以下を確認してください:

  1. 移動先のディスク容量が十分か(df -h
  2. 移動元のファイルが正しいか(ls -l
  3. 移動先に同名ファイルが存在しないか(ls -l /destination/
# 容量確認
df -h /backup

# 移動前の確認
ls -l source_file

# 移動先の確認
ls -l /backup/

# 安全に移動
mv -i source_file /backup/

7. スクリプト内でのエラーハンドリング

mvが失敗した場合の処理を必ず組み込んでください。

#!/bin/bash

mv /var/www/myapp /var/www/myapp.old || {
  echo "ファイル移動に失敗しました"
  exit 1
}

echo "移動が完了しました"

または、set -eでスクリプト全体をエラー時に停止させる設定を推奨します。

8. アトミック性の考慮

mvは同じファイルシステム内であれば、アトミック(不可分)な操作です。つまり、移動中に中断されることなく、一瞬で完了します。これにより、デプロイ時のダウンタイムを最小化できます。

# 新バージョンを準備
cp -r /tmp/myapp_new /var/www/myapp_tmp

# アトミックに切り替え
mv /var/www/myapp_tmp /var/www/myapp

ただし、異なるファイルシステム間ではアトミック性が保証されないため、注意が必要です。