Linux / コマンド / mv - ファイルの移動と名前の変更

mvは、ファイルやディレクトリを別の場所に移動したり名前を変更したりするコマンドです。同じファイルシステム内では、通常ディレクトリエントリを置き換える高速な名前変更で処理されますが、別のファイルシステムに移動する場合は、コピー後に元を削除するのと同様に動作します。

この記事では、基本的な文法、複数項目の移動、上書き制御、ターゲットパスの曖昧さを減らすオプション、および大容量移動時の注意点について説明します。

mvコマンドとは?

mvは、元のパスをターゲットパスに移動します。2つの引数を指定した場合、ターゲットが既存のディレクトリであればその中に移動し、そうでなければターゲット名に変更されます。ファイルシステムの境界を越える場合、GNU mvはコピーに成功した後に元を削除する方式で処理できるため、作業時間が長くなり、一部成功の可能性も生じます。

基本的な文法

mv [オプション] 移動元 移動先
mv [オプション] 移動元 ... ディレクトリ
mv [オプション] -t ディレクトリ 移動元 ...

ファイル名やパスに空白がある場合は引用符で囲み、ハイフンで始まる名前は可能であれば--の後に指定します。サポートされるオプションはディストリビューションとGNU Coreutilsのバージョンによって異なる場合があるため、mv --helpとman mvで現在のシステムの説明を確認してください。

mvの基本使用法

ファイル名を変更する

同じディレクトリ内で新しい名前を指定します。

mv draft.txt final.txt

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

対象が既存のディレクトリの場合は、元の名前のままその中に移動します。

mv report.pdf archive/

複数ファイルを一度に移動する

元が複数ある場合、最後の引数は既存の対象ディレクトリでなければなりません。次の2行は同じ作業を行う別の方法です。必要なファイルと old-logs/ を用意し、どちらか1行だけを実行してください。

mv *.log old-logs/
mv -t old-logs app.log access.log error.log

移動・名前変更の結果を確認する

mv が成功した場合、通常は出力がありません。名前を変更した後、元のパスが消え、新しいパスができたか確認できます。

printf 'demo\n' > before.txt
mv before.txt after.txt
test -f after.txt && test ! -e before.txt
echo $?

例の出力 0 は、両方の条件が真であることを意味します。異なるファイルシステムに移動する場合、内部的にコピーと削除が行われることがあるので、大容量作業の場合は結果ファイルのサイズや内容も検証してください。

主なオプション

オプション 説明
-i 既存の対象を上書きする前に確認します。
-n, --no-clobber 既存の対象は上書きされません。
-f, --force 確認なしで上書きを試みます。
-u, --update 対象がない場合や元のファイルが新しい場合など、条件に応じて移動します。
-v 処理するパスを出力します。
-b, --backup 上書きする対象ファイルのバックアップを作成します。
-T, --no-target-directory 対象をディレクトリではなく正確なパスとして扱います。
-t DIR 対象ディレクトリをオプションとして指定します。

長いオプションは意味を把握しやすく、スクリプトの確認にも役立ちます。ただし、移植性が重要なスクリプトでは対象システムがその GNU 拡張オプションをサポートしているかをまず確認してください。

実践的活用例

上書きする前に確認またはバックアップする

手動作業は-i、自動化で上書き自体を避けたい場合は-nが便利です。既存対象のバックアップが必要な場合は -b を検討してください。次の2行も別々の選択肢で、連続して実行する例ではありません。/etc/myapp/config.conf は説明用なので、練習では自分が所有するファイルと保存先に置き換えます。

mv -iv new.conf /etc/myapp/config.conf
mv -bv new.conf /etc/myapp/config.conf

対象パスを明確に指定する

対象の名前と同じディレクトリが偶然存在すると、意図しない場所に入る可能性があります。1つの正確な対象パスに変更するには、-T が曖昧さを減らしてくれます。ただし、既存の中身のあるディレクトリをそのまま置き換える指定ではありません。staging がディレクトリなら、current は存在しないか、置き換え可能な空のディレクトリである必要があります。

mv -T staging current
mv -t archive -- file1 file2

ファイルシステム間の移動を確認する

別のマウントポイントに大きなファイルを移動すると、すぐに終了する名前変更ではなく、実際のデータコピーと元の削除が発生する場合があります。空き容量と中断の可能性を確認し、重要なデータをコピー後に自分で検証してから元を削除したい場合は、mv ではコピー完了時に元が削除されるため、cpによるコピーと検証・削除を別の工程に分けてください。

df -h source-dir destination-dir
mv -v large-image.raw /mnt/archive/

mv と関連コマンドの比較

コマンド・方法 主な役割 適した状況
mv 移動または名前変更 元のパスをなくして対象のパスに移動する場合
cp 独立したコピーを作成 元とコピーの両方を保持する場合
rename 規則に従った複数の名前変更 導入されているrenameの実装と文法を確認して一括変更する場合
rsync --remove-source-files 検証可能な転送後、元のファイルを整理 大規模・リモート移動を詳細に制御する場合

使用する際の注意点

以下の例はGNU版を対象にしています。特に -n で既存ファイルをスキップしたときの終了状態は版や実装で異なるため、終了状態だけで全ファイルが移動したと判断しないでください。対応版では --update=none はスキップを失敗にせず、--update=none-fail はスキップを診断して失敗終了にします。ヘルプで利用できるか確認します。練習には移動先の同名項目がない、自分の作業用ファイルを使ってください。

移動はゴミ箱に送る作業ではありません

誤った上書きが発生すると、以前の対象ファイルを簡単に復元できません。重要なパスでは -i、-n またはバックアップを使用してください。

ファイルシステム間の移動は部分的に成功することがあります

複数の項目を移動中にスペース不足や権限エラーが発生すると、一部は対象にあり、残りは元に残ることがあります。項目ごとの結果を確認する必要があります。

ディレクトリのシンボリックリンクの後のスラッシュは避ける

元がディレクトリを指すシンボリックリンクである場合、後ろにスラッシュを付けるとシステムによって予期せぬ動作が起こることがあります。リンク自体を移動したい場合は、パスを明確に指定してください。

FAQ

mvは同じファイルシステムでデータを再コピーするのですか?

一般的に同じファイルシステムでは、名前の変更として処理されるため高速です。異なるファイルシステムに移動する場合は、コピー後に元を削除する方法になることがあります。

既存の対象ファイルを上書きしないにはどうすればよいですか?

mv -n 移動元 移動先を使用します。対話形式で確認が必要な場合は-iを使用してください。

ファイル名の変更と移動は文法が異なりますか?

どちらもmv 移動元 移動先形式です。対象が既存のディレクトリか新しいパスかによって結果が変わります。

複数のファイルを安全に一つのディレクトリに移動するにはどうすればいいですか?

mv -t 対象ディレクトリ -- ファイル...のように対象ディレクトリを指定すると、引数の構成が明確になります。

参考資料