mv コマンドは、ファイルやディレクトリを移動したり、名前を変更(リネーム)したりするためのコマンドです。
同じファイルシステム内では「名前の付け替え」に近い動作となり、異なるファイルシステム間ではコピー&削除に近い動作になります。
日常的には、
- ファイルを別ディレクトリへ移動する
- ファイル名・ディレクトリ名を変更する
- バックアップファイルへリネームする(
hoge → hoge.bakなど)
といった用途でよく使われます。
オプションを付けることで、上書き時の確認や、更新されたものだけを動かすといった制御も可能です。
mv [オプション] 旧ファイル名 新ファイル名mv [オプション] ファイル... ディレクトリmv [オプション] -t ディレクトリ ファイル...
第1引数に移動元(または旧ファイル名)、第2引数に移動先(または新ファイル名)を指定します。
移動先がディレクトリの場合、そのディレクトリ配下にファイルが配置されます。
複数ファイルを指定した場合は、最後の引数は必ずディレクトリである必要があります。
ディレクトリを「ディレクトリではなく 1 つのファイル名として扱いたい」場合は、-T オプションを使います。
・ファイル名を変更する(リネーム)
mv old.log new.log
old.log というファイル名を new.log に変更します。
同じディレクトリ内で「移動先」が新しいファイル名、というイメージです。
・ファイルを別のディレクトリへ移動する
mv app.log /var/log/myapp/
カレントディレクトリの app.log を /var/log/myapp/ ディレクトリへ移動します。
移動先に同名ファイルがある場合は、デフォルトでは確認なしで上書きされる点に注意が必要です。
・複数のファイルをまとめてディレクトリへ移動する
mv app.log db.log access.log /var/log/myapp/
複数ファイルを指定した場合、最後の引数はディレクトリである必要があります。
この例では app.log、db.log、access.log を /var/log/myapp/ へまとめて移動します。
・移動先ディレクトリを明示的に指定する(-t)
mv -t /var/log/myapp/ app.log db.log access.log
-t ディレクトリ を使うと、「移動先ディレクトリ → 移動元ファイル」の順で書けます。
スクリプトで、ディレクトリを変数に入れているような場合に読みやすくなります。
・上書き前に確認する(インタラクティブモード)
mv -i app.log /var/log/myapp/app.log
-i(–interactive)は、移動先に同名ファイルがある場合に、
本当に上書きしてよいか確認してくれます。
誤上書きを防ぎたいときには、alias mv='mv -i' としておく運用もよくあります。
・既存ファイルがある場合は上書きしない(no-clobber)
mv -n app.log /var/log/myapp/app.log
-n(–no-clobber)は、移動先に同名ファイルがある場合は何もしないオプションです。
確認プロンプトも出ないため、「すでにあるなら移動しない」という挙動にしたいときに使えます。
-i と -n を同時に指定した場合、後に指定した方が優先されます。
・移動内容を表示しながら処理する(verbose)
mv -v *.log /var/log/myapp/
-v(–verbose)は、移動したファイルを「old → new」の形式で表示します。
大量のファイルを動かすときや、ログとして残したいときに便利です。
・更新されたファイルだけを上書きする(-u)
mv -u app.log /var/log/myapp/
-u(–update)は、移動先にファイルがない場合、または移動元の方が新しい場合だけ上書きします。
簡易的な差分コピー・差分移動のような動きになるため、ログや成果物の整理に使える場合があります。
・移動先をディレクトリとして扱わず 1 つのパスとして扱う(-T)
mv -T config.new /etc/myapp/config
-T(–no-target-directory)は、第2引数を「ディレクトリ」として扱わず、
必ず 1 つのファイル名として扱うオプションです。
/etc/myapp/config が既に存在してディレクトリだとしても、
「config.new を /etc/myapp/config という名前のファイルにする」という扱いになります。
・既存ファイルをバックアップしながら上書きする(–backup)
mv -b --suffix=.bak app.conf /etc/myapp/app.conf
-b(–backup)は、上書き前に移動先のファイルをバックアップします。
–suffix でバックアップに付けるサフィックス(例: .bak)を指定可能です。
この例では、/etc/myapp/app.conf を /etc/myapp/app.conf.bak に退避してから、
新しい app.conf を上書き保存します。
・設定ファイルのバックアップと差し替え
設定ファイルを修正する前に、mv app.conf app.conf.bak のようにリネームしてバックアップを取っておき、
その後新しい設定ファイルを配置する、という使い方は定番です。
シェルの波括弧展開(mv app.conf{,.bak})と組み合わせることも多いです。
・ログや成果物の整理・アーカイブ
一定期間が経過したログファイルを、mv *.log /var/log/old/ のようにアーカイブ先へ移動したり、
日付ディレクトリごとにまとめたりするときに mv を使います。
・ディレクトリ構成の見直しやリファクタリング
アプリケーションのディレクトリ構成を整理する際に、ディレクトリ名の変更やディレクトリ間の移動で mv が多用されます。
Web ドキュメントルート、ログ、設定ファイルの配置見直しなどで頻出します。
・スクリプト内での安全なファイル差し替え
生成した新しいファイルを、そのまま本番ファイルの上に置くのではなく、
一時ファイル名(.tmp)で作成してから mv -f で一気に切り替える、というパターンもよく使われます。
mv は「ほぼ瞬間的」に切り替わるため、中途半端な状態が見えづらいのがメリットです。
mv コマンドはシンプルですが、上書き時の挙動をどう制御するかがポイントです。
誤上書きを防ぎたいなら -i や -n、バッチ処理で静かに上書きしたいなら -f、
ログを残したいなら -v、というように使い分けていくと安全に運用できます。
| short option | long option | description |
|---|---|---|
| -i | --interactive | 移動先に同名ファイルが存在する場合に上書きするかどうか確認プロンプトを表示する |
| -f | --force | 上書き時の確認を行わず強制的に上書きする(-i よりも優先されることが多い) |
| -n | --no-clobber | 移動先に同名ファイルが存在する場合は上書きせず何もせずにスキップする |
| -u | --update | 移動先にファイルがない場合または移動元の方が新しい場合にのみ上書きする |
| -v | --verbose | 移動したファイルやディレクトリの情報を「元 → 先」の形式で表示する |
| -b | --backup | 上書き前に移動先のファイルをバックアップとして退避する(CONTROL や --suffix で詳細指定可能) |
| -S | --suffix | バックアップファイルに付与するサフィックス(拡張子)を指定する(デフォルトは ~) |
| -t | --target-directory | 最後の引数ではなくこのオプションで指定したディレクトリを移動先として扱う |
| -T | --no-target-directory | 第2引数をディレクトリとして扱わず常に 1 つのファイル名として扱う |
| -Z | --context | SELinux が有効な環境で移動先ファイルやディレクトリに付与するセキュリティコンテキストを指定する(対応環境のみ有効) |
| --strip-trailing-slashes | 移動元パスの末尾にあるスラッシュを無視して扱う | |
| --help | mv コマンドの使い方(ヘルプ)を表示して終了する | |
| --version | mv コマンドのバージョン情報を表示して終了する |
ここでは、GNU coreutils ベースの mv コマンドでよく使われる主なオプションを TablePress の表としてまとめている想定です。
実際に利用できるオプションや挙動は、ディストリビューションやバージョンによって異なる場合があるため、
本番環境で使用する前に man mv で最新の仕様を確認してください。
新着情報
ブログランキングに参加しています。クリックして応援していただけると嬉しいです。
