こんにちは!はづきです
文系から一部上場IT企業に就職し、エンジニアをやっています
この記事はLinuxのmvコマンドについての備忘録です
mvはファイル/ディレクトリ名の変更や、ファイル/ディレクトリの移動をするためのコマンドです
以下のように移動元と移動先にファイルまたはディレクトリ名を指定することで実行できます
mv {オプション} {移動元※複数可} {移動先}
一度作成したファイル/ディレクトリの名前や配置場所の修正をしたい場合に役に立ちます
基本操作と頻繁に使用するオプションの実行例を紹介します。ぜひご参考ください
※この記事は初心者向けに平易に解説しています。正確な理解をしたい人は専門書・専門家をあたっていただければと思います。また、この記事の情報におけるCPの動作結果については自己責任でお願いします。
※本サイトにはプロモーション・広告が含まれています(はづきのブログより)
mvコマンドでファイル/ディレクトリ名を変更する
mvコマンドはファイルやディレクトリ名を変更することができます
#指定した移動先と同じ名前のファイル/ディレクトリが存在しなければ、
#移動先で指定した名前に変更される
mv {オプション} {移動元※複数可} {移動先}
名前を変更するための条件は、「指定した移動先と同じ名前のファイル/ディレクトリが存在しない」ことです。この場合、指定した移動先の名前に変更されます
移動先が既に存在する場合の挙動は「mvコマンドではファイルの上書きに注意」の章にて解説します
移動元・移動先は絶対パスや相対パスでの指定が可能なため、指定した階層で上記の条件を満たせば名前が変更されます
まずはファイル名の変更例を紹介します
#file1というファイルを作成しました
hazukiblog@hazukiBlog:~/work$ ls
file1
hazukiblog@hazukiBlog:~/work$ cat file1 #ファイルの中身の確認
file1です
#存在しないfile2を移動先に指定してmvコマンドを実行します
hazukiblog@hazukiBlog:~/work$ mv file1 file2
#file1がfile2という名前になりました
hazukiblog@hazukiBlog:~/work$ ls
file2
hazukiblog@hazukiBlog:~/work$ cat file2 #ファイルの中身は変わりません
file1です
同様に、ディレクトリ名の変更例も紹介します
#file1というファイルを配下に持つdir1を作成しました
hazukiblog@hazukiBlog:~/work$ ls
dir1
hazukiblog@hazukiBlog:~/work$ ls dir1
file1
#存在しないdir2を移動先に指定してmvコマンドを実行します
hazukiblog@hazukiBlog:~/work$ mv dir1 dir2
#dir1がdir2という名前に変わりました
hazukiblog@hazukiBlog:~/work$ ls
dir2
hazukiblog@hazukiBlog:~/work$ ls dir2 #配下のファイルは変わりません
file1
mvコマンドでファイル/ディレクトリを移動する
mv {オプション} {移動元※複数可} {移動先}
mvコマンドは移動元や移動先にファイル・ディレクトリ名を指定することで移動させることができます
以下では、その注意点と各移動パターンごとの実行例を紹介します
mvコマンドではファイルの上書きに注意
mvコマンドでは移動元と移動先に存在するファイル名を指定すると上書き保存が実行されます
その際に、移動元のファイルの中身を持った移動先のファイル名のファイルが作成されます
必要なファイルが消えてしまわないように注意が必要です。上書き保存を行いたくない場合は、後ほど紹介するオプション「-i」を使用しましょう
#file1とfile2という名前のファイルを用意しました
#それぞれのファイルの中身は以下のようになります
hazukiblog@hazukiBlog:~/work$ ls
file1 file2
hazukiblog@hazukiBlog:~/work$ cat file1
file1です
hazukiblog@hazukiBlog:~/work$ cat file2 #file2の中身は空
#移動元をfile1、移動先をfile2にしてcpコマンドを実行します
hazukiblog@hazukiBlog:~/work$ mv file1 file2
#file2がfile1の内容で上書きされました
#file1はなくなります
hazukiblog@hazukiBlog:~/work$ ls
file2
hazukiblog@hazukiBlog:~/work$ cat file1
cat: file1: No such file or directory
hazukiblog@hazukiBlog:~/work$ cat file2
file1です
指定したディレクトリ配下にファイルを移動する
mvコマンドの移動元にファイル、移動先にディレクトリを指定するとディレクトリ配下にファイルを移動させることができます
以下ではdir1配下にfile1を移動させる実行例を紹介します
#dir1というディレクトリとfile1というファイルを用意しました
#dir1配下には何もありません
hazukiblog@hazukiBlog:~/work$ ls
dir1 file1
hazukiblog@hazukiBlog:~/work$ ls dir1
#mvコマンドを実行します
hazukiblog@hazukiBlog:~/work$ mv file1 dir1
#dir1配下にfile1が移動しました
hazukiblog@hazukiBlog:~/work$ ls
dir1
hazukiblog@hazukiBlog:~/work$ ls dir1
file1
移動元として複数のファイル名をやワイルドカード(例.file*)を指定することで、一度に複数のファイルを移動させることができます
#dir1というディレクトリとfile1,file2,file3というファイルを用意しました
#dir1配下は空です
hazukiblog@hazukiBlog:~/work$ ls
dir1 file1 file2 file3
hazukiblog@hazukiBlog:~/work$ ls dir1
#複数のファイルを移動元として指定してmvコマンドを実行します
hazukiblog@hazukiBlog:~/work$ mv file1 file2 file3 dir1
#dir1配下にファイルがすべて移動しました
hazukiblog@hazukiBlog:~/work$ ls
dir1
hazukiblog@hazukiBlog:~/work$ ls dir1
file1 file2 file3
指定したディレクトリ配下にディレクトリを移動する
mvコマンドの移動元にディレクトリ、移動先にディレクトリを指定すると移動先ディレクトリの配下に移動元ディレクトリを移動させることができます
このとき移動元ディレクトリ配下にあるファイルやディレクトリがまとめて移動します
以下でその実行例を紹介します
#dir1、dir2という名前のディレクトリを用意しました
#dir1配下にはfile1というファイルがあります。dir2配下は空です
hazukiblog@hazukiBlog:~/work$ ls
dir1 dir2
hazukiblog@hazukiBlog:~/work$ ls dir1
file1
hazukiblog@hazukiBlog:~/work$ ls dir2
#mvコマンドを実行します
hazukiblog@hazukiBlog:~/work$ mv dir1 dir2
#dir1/file1がdir2配下に移動しました
hazukiblog@hazukiBlog:~/work$ ls
dir2
hazukiblog@hazukiBlog:~/work$ ls dir2
dir1
hazukiblog@hazukiBlog:~/work$ ls dir2/dir1/
file1
mvコマンドのオプションを紹介
-i:上書き処理を実行するか確認する
-i(--interactive)は、移動先ファイルが既に存在していて上書き処理が発生する場合に確認のメッセージを表示するオプションです
確認のメッセージに対して、y(Yes)を入力してEnterを押すと上書き処理が実行されます。反対に、n(No)を入力すると実行されずに終わります
mvコマンドでは移動先に指定したファイルが既に存在する場合に、名前の変更と同時に上書き処理が実行されます。このときに確認メッセージが表示されます
以下は「y」で上書き処理を実行するパターンです
#file1,file2という名前のファイルを用意しました
hazukiblog@hazukiBlog:~/work$ ls
file1 file2
#既にfile2が存在している状態で-iオプションを付けてmvを実行する
hazukiblog@hazukiBlog:~/work$ mv -i file1 file2
mv: overwrite 'file2'? y #←このような確認メッセージが出る
#file1がfile2に名前が変わり、中身はfile1のまま(=file2が上書きされた)
hazukiblog@hazukiBlog:~/work$ ls
file2
以下は「n」で上書き処理を実行しないパターンです
hazukiblog@hazukiBlog:~/work$ ls
file1 file2
hazukiblog@hazukiBlog:~/work$ mv -i file1 file2
mv: overwrite 'file2'? n
#実行していないため、何も変更がない
hazukiblog@hazukiBlog:~/work$ ls
file1 file2
-f:上書き処理を強制的に実行する
-f(-force)は、移動先に指定したファイルが既に存在する場合に発生する上書き処理を強制的に実行するオプションです
Linuxの動作環境・ディストリビューションによっては既存のファイルに上書きが発生する場合に確認が入ることがあります(-iオプション付与時のような動作に勝手になる)。-fではこれを無視することができます
#file1,file2という名前のファイルを用意しました
hazukiblog@hazukiBlog:~/work$ ls
file1 file2
hazukiblog@hazukiBlog:~/work$ mv -f file1 file2
#file1がfile2に名前が変わり、中身はfile1のまま(=file2が上書きされた)
hazukiblog@hazukiBlog:~/work$ ls
file2
#※動作環境によっては-fを指定しなくても同じ動作になる
-n:移動先のファイルが既に存在する場合、mvによる処理を実行しない
-n(--no-clobber)は、移動先に指定したファイルが既に存在する場合、名前の変更処理を実行しないためのオプションです
「mv file1 file2」を実行した場合、file1は中身をそのままにファイル名がfile2に変更されます。そして、file1自体は削除されます
しかし、-nを指定することで処理が実行されなくなります※以下参照
#file1,file2という名前のファイルを用意しました
hazukiblog@hazukiBlog:~/work$ ls
file1 file2
#移動先ファイルが存在する状態で-nを指定したため何も処理が実行されない
hazukiblog@hazukiBlog:~/work$ mv -n file1 file2
hazukiblog@hazukiBlog:~/work$ ls
file1 file2
-b:上書き処理実行時にバックアップファイルを作成する
-b(--backup)は、移動先に指定したファイルが既に存在する場合に、消えてしまうファイルのバックアップファイルを作成するためのオプションです
以下の実行例では、file1がfile2に名前が変わり、file2のバックアップとしてfile2~が作成されます
このバックアップファイルの名前については、この後紹介する-Sオプションで指定することが可能です
#file1,file2という名前のファイルを用意しました
hazukiblog@hazukiBlog:~/work$ ls
file1 file2
hazukiblog@hazukiBlog:~/work$ mv -b file1 file2
#「file2」は、file1がfile2に名前が変わり、file1の中身を持ったファイル
#「file2~」は、file2の中身を持ったバックアップファイル
hazukiblog@hazukiBlog:~/work$ ls
file2 file2~
-S:バックアップファイルの名前に指定した接尾辞を付ける
-S(--suffix)は、バックアップファイルに接尾辞を付けることのできるオプションです
以下は、バックアップファイル名に現在日時の情報を指定している実行例です
2通りのオプションの使用例を紹介します
#①「--suffix={バックアップファイルの接尾辞}」で指定する場合
#「%Y%m%d」で年月日を表しています
#「file2_20231114」という名前のバックアップファイルができました
hazukiblog@hazukiBlog:~/work$ ls
file1 file2
hazukiblog@hazukiBlog:~/work$ mv -b --suffix=_$(date +%Y%m%d) file1 file2
hazukiblog@hazukiBlog:~/work$ ls
file2 file2_20231114
#②「-S {バックアップファイルの接尾辞}」で指定する場合
#「%Y%m」で年月を表しています
#「file2_202311」という名前のバックアップファイルができました
hazukiblog@hazukiBlog:~/work$ ls
file1 file2
hazukiblog@hazukiBlog:~/work$ mv -b -S _$(date +%Y%m) file1 file2
hazukiblog@hazukiBlog:~/work$ ls
file2 file2_202311
-v:移動させたファイルの情報を表示する
-v(--verbose)は、移動させたファイルの情報を表示するオプションです
何がどこに移動されたのか明示的に表示されます
#dir1というディレクトリとfile1,file2,file3というファイルを用意しました
hazukiblog@hazukiBlog:~/work$ ls
dir1 file1 file2 file3
#-vを指定して、dir1配下に3個のファイルを移動させるmvを実行しました
#以下のように実行結果が明示的に表示されます
hazukiblog@hazukiBlog:~/work$ mv -v file* dir1
renamed 'file1' -> 'dir1/file1'
renamed 'file2' -> 'dir1/file2'
renamed 'file3' -> 'dir1/file3'
hazukiblog@hazukiBlog:~/work$ ls
dir1
-u:移動元ファイルが移動先ファイルより新しい場合のみ名前を変更する
-uは、移動先に指定したファイルが存在する場合、移動元ファイルが移動先ファイルよりタイムスタンプ(mtime)の日時情報が新しい場合にのみ名前変更(上書き処理)が実行されるオプションです
以下で、タイムスタンプ情報の異なるfile1とfile2を用意して動作検証を行った実行例を紹介します
#以下のstatコマンドよりタイムスタンプを確認
#file1のほうがfile2よりmtimeが新しいことがわかる
hazukiblog@hazukiBlog:~/work$ stat file1
File: file1
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 820h/2080d Inode: 1045 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2022-01-01 00:00:00.000000000 +0900 #file1のatime
Modify: 2025-01-01 12:00:00.000000000 +0900 #file1のmtime
Change: 2023-11-14 09:38:06.229271387 +0900 #file1のctime
Birth: 2023-11-14 09:29:30.969682634 +0900
hazukiblog@hazukiBlog:~/work$ stat file2
File: file2
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 820h/2080d Inode: 29427 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2025-01-01 12:00:00.000000000 +0900 #file2のatime
Modify: 2023-11-14 09:29:30.969682634 +0900 #file2のmtime
Change: 2023-11-14 09:39:05.119249047 +0900 #file2のctime
Birth: 2023-11-14 09:29:30.969682634 +0900
#この状態で-uを付与してmvを実行すると名前変更が行われる
hazukiblog@hazukiBlog:~/work$ mv -u file1 file2
hazukiblog@hazukiBlog:~/work$ ls
file2
ちなみに、file1のほうがctimeだけが新しい場合は名前変更処理は行われません(あくまでmtimeが処理実行の判断基準になっているということです)
#以下のstatコマンドよりタイムスタンプを確認
#file1のほうがfile2よりctimeが新しいことがわかる
hazukiblog@hazukiBlog:~/work$ stat file1
File: file1
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 820h/2080d Inode: 1045 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2022-01-01 00:00:00.000000000 +0900 #file1のatime
Modify: 2022-01-01 00:00:00.000000000 +0900 #file1のmtime
Change: 2023-11-14 09:34:18.161221718 +0900 #file1のctime
Birth: 2023-11-14 09:29:30.969682634 +0900
hazukiblog@hazukiBlog:~/work$ stat file2
File: file2
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 820h/2080d Inode: 29427 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-11-14 09:29:30.969682634 +0900 #file2のatime
Modify: 2023-11-14 09:29:30.969682634 +0900 #file2のmtime
Change: 2023-11-14 09:29:30.969682634 +0900 #file2のctime
Birth: 2023-11-14 09:29:30.969682634 +0900
#この状態で-uを付与してmvを実行すると名前変更が行われない
hazukiblog@hazukiBlog:~/work$ mv -u file1 file2
hazukiblog@hazukiBlog:~/work$ ls
file1 file2
-t:指定したディレクトリにファイル/ディレクトリを移動する
-tは、指定したディレクトリにファイル/ディレクトリを移動させるオプションです
mvの基本的な動作と同じになりますが、指定方法が「mv 移動元 移動先」ではなく、「mv -t 移動先ディレクトリ 移動元」という順番になります
-tという省略を用いずに、「--target-directory={移動先ディレクトリ名}」とすることで可読性を上げることができます
#dir1,2というディレクトリとfile1,2,3というファイルを用意しました
hazukiblog@hazukiBlog:~/work$ ls
dir1 dir2 file1 file2 file3
#-tを付与して移動先ディレクトリをdir1に指定しました
#dir2とfile1,2,3をdir1に移動させます
#※「mv --target-directory=dir1 file* dir2」でも同じ動作になります
hazukiblog@hazukiBlog:~/work$ mv -t dir1 file* dir2
hazukiblog@hazukiBlog:~/work$ ls
dir1
hazukiblog@hazukiBlog:~/work$ ls dir1
dir2 file1 file2 file3
-t指定時は通常操作の順番「mv 移動元 移動先」だとエラーになります
#-tを付与した場合、通常操作の「mv 移動元 移動先」ではエラーになります
hazukiblog@hazukiBlog:~/work$ ls
dir1 dir2 file1 file2 file3
hazukiblog@hazukiBlog:~/work$ mv -t file* dir1
mv: target 'file1' is not a directory
-T:名前変更(上書き処理)の場合のみ処理を実行する
-Tは、名前変更(上書き処理)の場合のみ処理を実行するオプションです
こちらは私が動作検証したときに、結果的にそのような挙動になった、というまでで実際のところは不明です
以下が、manコマンドで確認した-Tの説明になります
-T, --no-target-directory
treat DEST as a normal file
動作検証の結果を紹介します
以下は正常に実行された場合です。ファイル・ディレクトリの名前変更が実行されています
#dir1,2というディレクトリとfile1,2,3というファイルを用意しました
hazukiblog@hazukiBlog:~/work$ ls
dir1 dir2 file1 file2 file3
#移動元・移動先どちらもディレクトリを指定すると名前変更が実行される
hazukiblog@hazukiBlog:~/work$ mv -T dir1 dir2
hazukiblog@hazukiBlog:~/work$ ls
dir2 file1 file2 file3
hazukiblog@hazukiBlog:~/work$ ls dir2
#移動元・移動先どちらもファイルを指定すると名前変更が実行される
hazukiblog@hazukiBlog:~/work$ mv -T file1 file2
hazukiblog@hazukiBlog:~/work$ ls
dir2 file2 file3
以下がエラーになったパターンです。移動元・移動先がファイルとディレクトリの組み合わせの場合、処理は実行されません
#dir1,2というディレクトリとfile1,2,3というファイルを用意しました
hazukiblog@hazukiBlog:~/work$ ls
dir1 dir2 file1 file2 file3
#移動元・移動先がファイルとディレクトリの組み合わせの場合実行できない
hazukiblog@hazukiBlog:~/work$ mv -T file1 dir1
mv: cannot overwrite directory 'dir1' with non-directory
hazukiblog@hazukiBlog:~/work$ mv -T dir1 file1
mv: cannot overwrite non-directory 'file1' with directory 'dir1'
コメント