【Linux】mv-ファイル/ディレクトリの移動と名前変更|初学者に向けた備忘録

Linux
スポンサーリンク
はづき
はづき

こんにちは!はづきです

文系から一部上場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'

コメント

タイトルとURLをコピーしました