mvでファイルを移動する
mvでファイルを移動する とは
mvコマンドで、ファイルやディレクトリを移動する方法を実際に操作して習得します。本レッスンでは、mvでファイルを移動する の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ重要か
mv は「移動」と「リネーム」の両方を担う、地味ながら最頻出のコマンドです。デプロイで成果物を本番ディレクトリへ移す、ログをアーカイブ用フォルダに集約する、リネーム規約に従ってファイル名を直すなど、用途は無数にあります。cp と違いコピー元が残らないため、操作ミスのインパクトが大きい点も意識しましょう。
ビルドツールが一時ファイルを生成し、それを本番名にリネームしてアトミックに切り替える、というのも mv の典型用途です。同一ファイルシステム内なら mv はメタデータ更新だけで一瞬で終わり、書き込み途中のファイルを公開して事故になる心配がほぼありません。
基本構文
ターミナル
mv [オプション] 元 先
mv [オプション] 元1 元2 ... 先ディレクトリ主要オプションは下記のとおりです。
| オプション | 役割 |
|---|---|
| -i | 上書き前に確認 |
| -n | 既存があっても上書きしない |
| -v | 移動の様子を表示 |
| -u | 新しいものだけ上書き(GNU coreutils のみ。macOS 標準の mv では使用不可) |
| -t | 移動先ディレクトリを先に指定(GNU coreutils のみ。macOS 標準の mv では使用不可) |
| --backup | 上書き前にバックアップを残す(GNU coreutils のみ。macOS 標準の mv では使用不可) |
動作の図解
代表例
ターミナル
# リネーム
$ cd /tmp && echo data > old_name.txt
$ mv old_name.txt new_name.txt
$ ls new_name.txt
new_name.txtターミナル
# 別ディレクトリへ移動
$ cd /tmp && mkdir -p archive && echo log > log_2026_05.txt
$ mv log_2026_05.txt archive/
$ ls archive
log_2026_05.txtターミナル
# 複数ファイルを一括で移動
$ cd /tmp && touch f1.txt f2.txt f3.txt && mkdir -p box
$ mv f1.txt f2.txt f3.txt box/
$ ls box
f1.txt
f2.txt
f3.txtターミナル
# -t で先に移動先を指定すると xargs と組み合わせやすい(Linux/GNU coreutils 環境向け。macOS 標準の mv では -t が使えないため注意)
find /tmp -maxdepth 1 -name '*.log' -print0 | xargs -0 mv -t /tmp/archive/cp との違い
| 観点 | cp | mv |
|---|---|---|
| 元ファイル | 残る | 消える |
| 主な用途 | バックアップ・複製 | 整理・改名 |
| ディレクトリ操作 | -r 必須 | そのまま OK |
| 大量データ | I/O が走る | 同一ファイルシステム内ならメタデータ更新だけで高速 |
| 別パーティション | コピー後そのまま | 内部でコピー+削除になる |
同じファイルシステム内の
mvは実質「リンクの付け替え」で完了するため一瞬で終わります。一方、別パーティションへのmvはコピー+削除になり時間がかかります。
リネームと移動が同じコマンドなのは UNIX らしい設計です。「親ディレクトリ+名前」を変更しているだけ、と捉えると理解が深まります。
やってしまいがちな事故
mv * oldと末尾スラッシュを書き忘れ、oldディレクトリが存在しないとき、対象ファイルが1つだけだと意図せずoldという名前にリネームされてしまう(複数ファイルあればエラーで止まる)。末尾に/を付けてmv * old/と書くと、old/が存在しない場合は常にエラーになるため事故を防ぎやすい- 大量の
mvをforで回したら、対象がループ中に動いて混乱する - 重要ファイルを
mvで同名上書きして元ファイルが消える - 移動先のつもりで既存ファイル名を指定してしまい、そのファイルを上書きしてしまう
安全策は次の通りです。
- 本番では
mv -i(またはmv -n)を使う - 事前に
lsで対象を確認する cp -pでバックアップしてからmvする- 引用符をしっかり付けてグロブ展開の範囲を絞る
アトミック書き換えの定番テクニック
設定ファイルを安全に書き換える手順は次の通りです。
ターミナル
TMP=$(mktemp)
sed 's/old/new/' /etc/app.yml > "$TMP"
mv "$TMP" /etc/app.ymlmv は同じファイルシステム内なら原子的に置き換わるため、読み込み中のプロセスから見て「中途半端な内容」になることがありません。
連番リネームの考え方
複数ファイルをまとめて規則的にリネームしたいときは、mv をループで回すのが基本です。
ターミナル
cd /tmp && touch img1.txt img2.txt img3.txt
n=1
for f in img*.txt; do
mv "$f" "photo_$n.txt"
n=$((n+1))
done
ls photo_*.txt大量の一括リネームには rename コマンドもありますが、まずは mv とループの組み合わせを理解しておくと応用が利きます。
やってみよう
演習エディタで /tmp 配下にファイルを作り、mv で別名にしたり、ディレクトリへ移動したりしてみましょう。ls で前後を見比べると、元ファイルが消えていることが体感できます。
まとめ
mvは移動とリネームを同時に担う- 同一ファイルシステム内なら超高速・原子的に切り替わる
- 上書き事故を避けるなら
-i-nを活用 cpと違って元ファイルは残らないことに注意- 設定ファイルのアトミック書き換えにも使える
次のレッスン
次は rmでファイルを削除する で、mvコマンドで、ファイルやディレクトリを移動する方法を実際に操作して習得します を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- mv コマンド の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. mv コマンド とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
課題
- mv を使う
- before.txt が消え after.txt だけになる