UNIX/Linuxの部屋 コマンド:mv

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド mv ファイル・ディレクトリの移動、リネーム (名前変更) このエントリーをはてなブックマークに追加

最終更新


UNIX/Linux の mv コマンドはファイルの移動と、ファイル名の変更という2つの機能を持つコマンドである。基本的なコマンドであるものの、ディレクトリが存在するかどうかで挙動がかわるのでわかりづらいコマンドでもある。


mv コマンドの基本的な使い方
mv コマンドの書式は下記のとおりである。

移動の場合:
% mv [移動元ファイル] [移動先ディレクトリ]
% mv [移動元ディレクトリ] [移動先ディレクトリ]
% mv [移動元ファイル1] [移動元ファイル1] [移動元ディレクトリ1] [移動元ディレクトリ2] [移動先ディレクトリ]
リネームの場合:
% mv [変更前ファイル名] [変更後ファイル名]
% mv [変更前ディレクトリ名] [変更後ディレクトリ名]

mv コマンドのよくある使い方
file.txt を dir/ に移動:
% mv file.txt dir/
file1.txt と file2.txt を dir/ に移動:
% mv file1.txt file2.txt dir/

(to-dir ディレクトリが存在する場合) dir を to-dir の下に移動:
% mv dir to-dir/

file1 を file2 にリネーム:
% mv file1 file2

(dir2 が存在しない場合) dir1 を dir2 にリネーム:
% mv dir1 dir2

mv コマンドが移動かリネームかを決めるロジック
移動かリネームかを決めるロジックは下記のとおり。
  • 最後の引数がディレクトリとして存在するならば、移動である。
  • そうでないなら、リネームである。

逆に言うと、ファイルやディレクトリを移動したいなら、移動先ディレクトリを mkdir コマンドであらかじめ作成しておく必要がある。

mv コマンドの、移動・リネームのミス防止
上記のように mv コマンド実行時にディレクトリを作り忘れると、移動のつもりが誤ってリネームしてしまうことになる。コマンドラインからタイプするときもミスしやすいが、シェルスクリプトで処理を自動化する際も、想定外のバグを防止するための方法を考察する。

当ページ管理人としては、事故防止のため以下のルールを提案する。
  • 移動先ディレクトリの最後に / を付ける

こうしておくと、ファイルの移動時に dir を作り忘れても、エラーとなる。
日本語環境:
% mv file.txt dir/
mv: cannot move `x' to `y/': ディレクトリではありません
英語環境:
% mv file.txt dir/
mv: cannot move `x' to `y/': Not a directory

ただし、ディレクトリを移動をしようとして移動先の dir2 を作り忘れた場合は、スラッシュをつけてもリネームが成功してしまうので、万能のルールではない。
% mv dir1 dir2/

主に Linux で使われる GNU coreutils の mv コマンドであれば、-t または --target-directory を指定すると、移動先ディレクトリが存在しない場合必ずエラーになる。
% mv -t dir2 dir1
mv: `dir2' にアクセス中: そのようなファイルやディレクトリはありません
→ mv --target-directory=dir2 dir1 でも同じ効果がある。

拡張子の一括変更
DOS・Windows とは違い、UNIX では ファイルグロブの展開はシェルの役割なので、
% mv *.txt *.txt.bak
などとしても拡張子の一括変換はできない。Linux においては rename コマンドにて
一括リネームが可能である。

Linux 以外の場合は、csh・tcsh なら foreach、sh・bash なら for を使うとよい。

mv コマンドのオプション
▷ -i 移動先のファイルが既に存在する場合、上書きしてよいか確認する
▷ -f 強制的に削除を行う。alias mv mv -i としているときに -f オプションを使うと便利
▷ -R 指定ディレクトリ以下のファイルを再帰的に移動
▷ -t または --taget-directory:
Linux の mv のみ使用可。移動先のディレクトリを指定する。上記で説明したように、移動のつもりがリネームさせないために使える。また、xargs コマンドと組み合わせて使う際、下記のように素直に書くことができる。
find . -name \*.txt | xargs mv -t to-dir/
このオプションを使わない場合、下記のようにわかりづらい書き方になる。
% find . -name \*.txt | xargs -i -n 10 mv {} /tmp
→ GNU xargs の場合 (遅い)
% find . -name \*.txt | xargs -J % mv % /tmp
→ BSD xargs の場合

ファイル名のエンコーディングの変換
ファイル名自体のエンコーディングを変換する場合は、convmv コマンドを使うとよい。

関連コマンド
移動やリネームではなく、元ファイルをのこしたままコピーする場合は cp コマンドを使う。

mv コマンドは、移動先ディレクトリを新規作成することはない。移動先ディレクトリはあらかじめ mkdir コマンドで作成しておこう。

mv 結果の確認のため、ls や cd コマンドを活用してほしい。

mv の発音について。
>> Linuxオンラインマニュアル(man) Linux mv(1)
>> FreeBSDオンラインマニュアル(man) FreeBSD mv(1)
>> Solaris10オンラインマニュアル(man) Solaris10 mv(1)

読み方 mv (UNIXコマンド) [えむ・う゛い] [むーぶ] このエントリーをはてなブックマークに追加

"MoVe" の略。