こんにちは、フルスタックエンジニアのryuです。
Linuxでファイルを別のディレクトリへ移動したい。 名前を変更したい。
そんなときに使うのが、mvコマンドです。
mvは基本コマンドですが、同名ファイルの上書きに注意が必要です。
この記事では、ファイルとディレクトリの移動、名前変更、上書き防止、異なるファイルシステム間での動作まで解説します。
mvコマンドとは?¶
mvはmoveに由来し、ファイルやディレクトリを移動または名前変更するコマンドです。
基本書式は以下です。
mv [オプション] 移動元 移動先
移動と名前変更は同じコマンド¶
別のディレクトリを移動先に指定すると、ファイルを移動します。
mv report.txt backup/
新しいファイル名を指定すると、名前を変更します。
mv report.txt report-old.txt
Linuxでは、移動と名前変更を同じmvで行います。
cpとの違い¶
cpはコピー元を残して複製します。
mvでは、処理後に移動元が残りません。
cp:元を残してコピーする
mv:元を移動する、または名前を変える
元ファイルを残したい場合は、mvではなくcpを使いましょう。
【関連記事】Linuxのcpコマンドの使い方
ファイルを別の場所へ移動する¶
まずは、1つのファイルを別のディレクトリへ移動してみましょう。
実行前後にlsで確認します。
1つのファイルを移動する¶
練習用のファイルとディレクトリを作成します。
touch report.txt
mkdir backup
ファイルを移動します。
mv report.txt backup/
移動できたか確認します。
ls -l backup/report.txt
移動元の場所には、report.txtが残りません。
複数ファイルを移動する¶
複数のファイルを指定する場合は、最後に移動先ディレクトリを指定します。
mv file1.txt file2.txt file3.txt backup/
最後のbackup/は、あらかじめ存在するディレクトリである必要があります。
GNU mvでは、-tを使って移動先を先に指定できます。
mv -t backup/ file1.txt file2.txt file3.txt
複数の移動元がある場合は、移動先が明確になります。
ワイルドカードで移動する¶
ログファイルをまとめて移動する場合は、ワイルドカードを使えます。
mv *.log old-logs/
実行前に、何が対象になるか確認しましょう。
printf '%s\n' *.log
*は、通常.から始まる隠しファイルを対象にしません。
ファイル名を変更する¶
mvでは、ファイルを同じディレクトリ内で別名へ変更できます。
拡張子を変更する場合も、操作方法は同じです。
ファイルをリネームする¶
test1.txtをtest2.txtへ変更します。
mv test1.txt test2.txt
変更後に確認します。
ls -l test2.txt
同じファイルシステム内なら、通常内容をコピーせず名前や場所を変えます。
そのため、大きなファイルでも短時間で終わることがあります。
ディレクトリ名を変更する¶
ディレクトリも同じ方法で変更できます。
mv project-old project-new
ディレクトリの中身も、そのまま新しい名前の下へ移ります。
設定ファイルやスクリプトが古いパスを参照していないか確認してください。
ディレクトリを移動する¶
mvでは、ディレクトリの移動に-rを付ける必要はありません。
ファイルと同じ書式で移動できます。
既存ディレクトリの中へ移動する¶
projectをarchiveの中へ移動します。
mkdir archive
mv project archive/
結果は次の構造です。
archive/
└── project/
同名ディレクトリがある場合は、実行前に中身を確認しましょう。
移動先をディレクトリとして扱わせない¶
-Tを使うと、移動先を既存ディレクトリの中ではなく、1つの対象として扱います。
mv -T project-old project-new
スクリプトなどで、移動先がディレクトリだった場合に意図せず中へ入ることを防げます。
中身がある既存ディレクトリは自由に置き換えられません。
上書きを防いで移動する¶
移動先に同名ファイルがある場合、通常のmvでは上書きされる可能性があります。
重要なファイルでは、確認やバックアップのオプションを使いましょう。
-iで上書き前に確認する¶
-iを付けると、既存ファイルを上書きする前に確認します。
mv -i report.txt backup/
mv: overwrite 'backup/report.txt'?
上書きする場合はy、中止する場合はnを入力します。
手作業で設定ファイルを移動するときに便利です。
既存ファイルを上書きしない¶
多くの環境では、-nを使うと既存ファイルを上書きしません。
mv -n report.txt backup/
新しいGNU Coreutilsでは、次の書き方も利用できます。
mv --update=none report.txt backup/
利用可否はmv --helpで確認してください。
--backupで移動前のファイルを残す¶
GNU mvでは、上書きされる移動先ファイルのバックアップを作成できます。
mv --backup=numbered report.txt backup/
既存ファイルは、次のような名前で残ります。
report.txt.~1~
変更前へ戻す可能性がある場合に便利です。
mvでよく使うオプション¶
mvの主なオプションを整理すると、以下の通りです。
| オプション | 内容 |
|---|---|
-i |
上書き前に確認する |
-f |
上書き前の確認を行わない |
-n |
既存ファイルを上書きしない |
-u |
移動元の方が新しい場合などに移動する |
-v |
移動内容を表示する |
-t |
移動先ディレクトリを先に指定する |
-T |
移動先を通常の1つの対象として扱う |
--backup |
上書き前のファイルを残す |
-vで移動内容を表示する¶
-vを付けると、処理した内容を表示します。
mv -v report.txt backup/
renamed 'report.txt' -> 'backup/report.txt'
複数ファイルを移動するときに、何が処理されたか確認しやすくなります。
-uは更新日時を基準にする¶
-uは、移動先が存在しない場合や、移動元の更新日時が新しい場合に移動します。
mv -u report.txt backup/
ファイル内容を比較するわけではありません。
更新日時の扱いはファイルシステムによって違う場合があるため、厳密な同期にはrsyncなども検討しましょう。
-fは権限を突破しない¶
-fは、上書き時の確認を表示しないためのオプションです。
mv -f report.txt backup/
移動先へ書き込む権限がない場合や、読み取り専用のファイルシステムでは、-fを付けても解決しません。
Permission deniedが出たら、所有者や親ディレクトリの権限を確認しましょう。
異なるファイルシステムへ移動するときの注意点¶
同一ファイルシステム内のmvと、別のファイルシステムへのmvでは内部の動作が異なります。
USBメモリ、別パーティション、ネットワークストレージなどへの移動では注意が必要です。
別ファイルシステムではコピー後に元を削除する¶
同一ファイルシステム内では、一般的に名前や場所を変更します。
別のファイルシステムへ移動する場合は、そのまま名前変更できないため、コピーしてから元を削除する動作になります。
コピー先へデータを作成
↓
コピー成功を確認
↓
移動元を削除
大きなファイルでは時間がかかり、移動中は移動元と移動先の両方に容量が必要です。
移動中の失敗を考える¶
途中で失敗すると、一部だけ移動先に残ることがあります。
移動後は、件数やファイルサイズを確認しましょう。
find source-dir -type f | wc -l
find destination-dir -type f | wc -l
重要なデータでは、先にcp -aやrsyncでコピーし、確認後に元を削除する方法もあります。
mvコマンドでよくあるエラー¶
エラーが出た場合は、移動元、移動先、権限を確認します。
すぐにsudoや-fを追加しないようにしましょう。
cannot stat¶
移動元が見つからない場合に表示されます。
mv: cannot stat 'report.txt': No such file or directory
現在地とファイル名を確認します。
pwd
ls -la
Permission denied¶
移動元の親ディレクトリから削除できないか、移動先へ書き込めない可能性があります。
id
ls -ld 移動元の親ディレクトリ
ls -ld 移動先ディレクトリ
必要な権限だけを修正してください。
Directory not empty¶
既存の中身があるディレクトリを、別のディレクトリで置き換えようとした場合などに表示されます。
両方の中身を確認し、統合、削除、別名への変更のどれが必要か判断しましょう。
mvを使う前後の確認方法¶
mvは移動元を残さないため、重要なデータでは実行前後の確認が必要です。
私は、設定ファイルや大量データを移動するときに次の点を確認します。
実行前にパスを確認する¶
現在地、移動元、移動先を確認します。
pwd
ls -ld source destination
ワイルドカードを使う場合は、展開結果も確認してください。
printf '%s\n' source/*.conf
実行後に結果を確認する¶
移動先へファイルがあるか確認します。
ls -la destination/
重要なファイルでは、サイズやチェックサムも確認できます。
sha256sum destination/report.txt
エンジニアとして10年以上Linuxを扱っていますが、コマンドが正常終了しただけでは作業完了にしません。
移動先で利用でき、想定外の上書きがないことまで確認します。
mvコマンドの使い方まとめ¶
ファイルを別のディレクトリへ移動する場合は、以下のように実行します。
mv report.txt backup/
名前変更もmvで行います。
mv report.txt report-old.txt
上書き前に確認する場合は-i、処理内容を表示する場合は-vを使います。
mv -iv report.txt backup/
別ファイルシステムへの移動では、コピー後に元を削除する動作になるため、時間、空き容量、途中失敗に注意してください。
移動元と移動先を確認し、上書きされるファイルがないか確かめてから実行しましょう。
Linuxのファイル操作を練習したい方へ¶
InfraAcademyでは、ブラウザ上のLinux環境でファイルの作成、コピー、移動、名前変更を練習できます。
基本操作から学びたい方は、Linux入門講座を確認してみてください。
サーバー運用やバックアップまで学びたい方は、Linux中級講座がおすすめです。