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 では使用不可)

動作の図解

diagram (will load when visible)

代表例

ターミナル

# リネーム $ 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 との違い

観点cpmv
元ファイル残る消える
主な用途バックアップ・複製整理・改名
ディレクトリ操作-r 必須そのまま OK
大量データI/O が走る同一ファイルシステム内ならメタデータ更新だけで高速
別パーティションコピー後そのまま内部でコピー+削除になる

同じファイルシステム内の mv は実質「リンクの付け替え」で完了するため一瞬で終わります。一方、別パーティションへの mv はコピー+削除になり時間がかかります。

リネームと移動が同じコマンドなのは UNIX らしい設計です。「親ディレクトリ+名前」を変更しているだけ、と捉えると理解が深まります。

やってしまいがちな事故

  • mv * old と末尾スラッシュを書き忘れ、old ディレクトリが存在しないとき、対象ファイルが1つだけだと意図せず old という名前にリネームされてしまう(複数ファイルあればエラーで止まる)。末尾に / を付けて mv * old/ と書くと、old/ が存在しない場合は常にエラーになるため事故を防ぎやすい
  • 大量の mvfor で回したら、対象がループ中に動いて混乱する
  • 重要ファイルを mv で同名上書きして元ファイルが消える
  • 移動先のつもりで既存ファイル名を指定してしまい、そのファイルを上書きしてしまう

安全策は次の通りです。

  • 本番では mv -i(または mv -n)を使う
  • 事前に ls で対象を確認する
  • cp -p でバックアップしてから mv する
  • 引用符をしっかり付けてグロブ展開の範囲を絞る

アトミック書き換えの定番テクニック

設定ファイルを安全に書き換える手順は次の通りです。

ターミナル

TMP=$(mktemp) sed 's/old/new/' /etc/app.yml > "$TMP" mv "$TMP" /etc/app.yml

mv は同じファイルシステム内なら原子的に置き換わるため、読み込み中のプロセスから見て「中途半端な内容」になることがありません。

連番リネームの考え方

複数ファイルをまとめて規則的にリネームしたいときは、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 つができることを確認しましょう。

  1. mv コマンド の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. mv コマンド とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

課題

  1. mv を使う
  2. before.txt が消え after.txt だけになる

ヒント

script.sh
script.sh
学習モード
script.sh
ターミナル出力