「mvコマンドでリネームできるのは知っているけど、複数ファイルの一括変更はどうすればいい?」
Linuxのファイル操作で、cpやrmと並んで毎日使うのが
mv(ムーブ)コマンドです。ファイルの移動だけでなく、ファイル名の変更にも使う、サーバー管理の基本中の基本のコマンドです。この記事では、
mv コマンドの基本的な使い方から、上書き防止のオプション、日付付きバックアップの作成、renameコマンドによる一括リネームまで、実務で必要になる知識を網羅して解説します。mvコマンドとは?(cpとの違い・仕組み)
mv は「move」の略で、ファイルやディレクトリを移動する、または名前を変更(リネーム)するコマンドです。cpコマンドとの大きな違いは、mvは元ファイルが残らないという点です。cpは「コピー」なので元ファイルがそのまま残りますが、mvは移動なので元の場所からファイルがなくなります。
もう一つ知っておくべき重要なポイントがあります。同じファイルシステム(パーティション)内でmvを実行すると、実際にはデータのコピーは行われず、inode(ファイルの管理情報)の参照先を付け替えるだけで完了します。そのため、数GBの巨大なファイルでも一瞬で移動が完了します。
一方、異なるファイルシステムをまたぐ移動(例:/home から /tmp が別パーティションの場合)では、内部的にはコピー+削除が行われるため、ファイルサイズに比例して時間がかかります。
基本的な使い方
1. ファイルを別のディレクトリに移動する
最も基本的な使い方です。移動先にディレクトリを指定すると、そのディレクトリ内にファイルが移動します。# 基本書式: mv [移動元ファイル] [移動先ディレクトリ] # sample.txt を /tmp/ ディレクトリに移動する $ mv sample.txt /tmp/
2. ファイル名を変更する(リネーム)
移動先にファイル名を指定すると、ファイル名の変更になります。# old.txt を new.txt にリネームする $ mv old.txt new.txt
3. 複数ファイルをまとめて移動する
複数のファイルを一度に移動する場合は、最後の引数にディレクトリを指定します。ワイルドカード(*)を使えばさらに効率的です。# 複数ファイルを個別に指定して移動する $ mv file1.txt file2.txt file3.txt /tmp/backup/ # ワイルドカードで .log ファイルをまとめて移動する $ mv *.log /var/log/archive/
4. ディレクトリを移動する
ディレクトリの移動もファイルと同じ書式です。cpのように-r オプションは不要です。# mydir ディレクトリを /opt/ 配下に移動する $ mv mydir /opt/
実務で必須のオプション
1. -i(上書き前に確認する)
移動先に同名のファイルがある場合、mvはデフォルトでは何も聞かずに上書きします。これが事故の原因になるため、-i(interactive)オプションで上書き前に確認プロンプトを表示させるのが安全です。# 上書き前に確認する $ mv -i sample.txt /tmp/ mv: overwrite '/tmp/sample.txt'? y
y を入力すると上書き、n を入力するとキャンセルされます。※多くのLinuxディストリビューション(RHEL系など)では、rootユーザーの
.bashrc に alias mv='mv -i' がデフォルトで設定されています。そのため、rootでは自動的に確認が出ますが、一般ユーザーやスクリプト内では設定されていない場合があるので、明示的に -i を付けるのが確実です。2. -f(強制的に上書きする)
-f(force)オプションを指定すると、確認なしで強制的に上書きします。前述の alias mv='mv -i' が設定されている環境で、スクリプトなどから確認なしで実行したい場合に使います。# 確認なしで強制的に上書きする $ mv -f old_config.conf /etc/myapp/config.conf
3. -n(上書きしない)
-n(no-clobber)オプションを指定すると、移動先に同名ファイルが存在する場合、上書きせずにスキップします。「既存のファイルを絶対に消したくない」場面で重宝します。# 移動先に同名ファイルがあっても上書きしない $ mv -n newfile.txt /tmp/
4. -v(処理内容を表示する)
-v(verbose)オプションを付けると、どのファイルがどこに移動されたかを表示してくれます。大量のファイルを移動する際や、スクリプトのデバッグ時に役立ちます。# 移動内容を表示する $ mv -v *.log /var/log/archive/ renamed 'access.log' -> '/var/log/archive/access.log' renamed 'error.log' -> '/var/log/archive/error.log'
5. -u(新しい場合のみ移動する)
-u(update)オプションは、移動元のファイルが移動先のファイルよりも新しい場合にのみ移動を実行します。古いファイルで新しいファイルを上書きしてしまう事故を防げます。# 移動元が新しい場合のみ移動する $ mv -u updated_config.conf /etc/myapp/config.conf
6. -b(バックアップを作成して移動する)
-b(backup)オプションは、移動先に同名ファイルがある場合、上書きする前に既存ファイルのバックアップ(末尾に ~ が付いたファイル)を自動作成します。# 上書き前にバックアップを自動作成する $ mv -b newfile.txt /tmp/newfile.txt # /tmp/ に newfile.txt~ というバックアップが作られる $ ls /tmp/newfile* /tmp/newfile.txt /tmp/newfile.txt~
応用・実務Tips
1. 日付付きバックアップを作成するリネーム
サーバー運用では、設定ファイルを編集する前に「元に戻せるようにバックアップを取る」のが鉄則です。日付付きのファイル名にリネームしておけば、いつ時点のバックアップかが一目でわかります。# httpd.conf を日付付きファイル名でバックアップする $ mv /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.$(date +%Y%m%d) # 結果を確認する $ ls /etc/httpd/conf/httpd.conf* /etc/httpd/conf/httpd.conf.20260312
2. cpではなくmvを使うべき場面
同じファイルシステム内でファイルを「移動」する場合、cpで「コピー+元ファイル削除」をするよりも、mvを使う方が圧倒的に高速です。前述の通り、mvはinode(ファイルの管理情報)の付け替えだけで完了するため、10GBのファイルでも一瞬で完了します。cpの場合はデータの実コピーが発生するため、ファイルサイズに比例して時間がかかります。
・mv を使う場面:元ファイルが不要な移動・リネーム
・cp を使う場面:元ファイルを残したいコピー・バックアップ
3. renameコマンドで複数ファイルを一括リネームする
mvコマンドは1回の実行で1つのファイルしかリネームできません。「拡張子を一括で変更したい」「ファイル名のパターンを一括で置換したい」場合は、rename コマンドが便利です。RHEL系(AlmaLinux、Rocky Linux等)には
rename コマンドが標準でインストールされています(util-linux版)。# 基本書式: rename [置換前] [置換後] [対象ファイル] # .log を .log.bak に一括変更する $ rename .log .log.bak *.log # 結果を確認する $ ls *.bak access.log.bak error.log.bak app.log.bak
rename は単純な文字列置換です。Debian/Ubuntu系の rename(Perl版)とは書式が異なるため注意してください。forループを使ってmvで一括リネームする方法もあります。
# for ループで .txt を .txt.bak に一括リネームする $ for f in *.txt; do mv "$f" "${f}.bak"; done
トラブルシュート・エラー対処
1. 「Permission denied」が出た時の対処法
移動元ファイルの読み取り権限、または移動先ディレクトリの書き込み権限がない場合に発生します。# エラー例 $ mv /etc/hosts /tmp/ mv: cannot move '/etc/hosts' to '/tmp/hosts': Permission denied
sudo を付けて実行するか、移動先ディレクトリの権限を確認することです。# sudo を付けて実行する $ sudo mv /etc/hosts /tmp/ # 移動先ディレクトリの権限を確認する $ ls -ld /tmp/ drwxrwxrwt. 10 root root 4096 Mar 12 10:00 /tmp/
2. 「Directory not empty」が出た時の対処法
移動先に同名のディレクトリが既に存在し、かつそのディレクトリが空でない場合に発生します。# エラー例 $ mv mydir /opt/mydir mv: cannot move 'mydir' to '/opt/mydir': Directory not empty
# 移動先のディレクトリを削除してから移動する $ rm -rf /opt/mydir $ mv mydir /opt/ # または、別の名前で移動する $ mv mydir /opt/mydir_new
3. 「are the same file」が出た時の対処法
移動元と移動先が同じファイルを指している場合に発生します。ハードリンクやシンボリックリンクが絡んでいるときに起こりやすいエラーです。# エラー例 $ mv file.txt file.txt mv: 'file.txt' and 'file.txt' are the same file
ls -li でinode番号を確認してください。本記事のまとめ(mvコマンド早見表)
| やりたいこと | コマンド |
|---|---|
| ファイルを移動する | mv ファイル名 移動先ディレクトリ |
| ファイル名を変更する | mv 旧ファイル名 新ファイル名 |
| 複数ファイルをまとめて移動する | mv ファイル1 ファイル2 移動先ディレクトリ |
| 上書き前に確認する | mv -i ファイル名 移動先 |
| 強制的に上書きする | mv -f ファイル名 移動先 |
| 上書きしない(スキップ) | mv -n ファイル名 移動先 |
| 処理内容を表示する | mv -v ファイル名 移動先 |
| 新しい場合のみ移動する | mv -u ファイル名 移動先 |
| バックアップを作成して移動する | mv -b ファイル名 移動先 |
| 日付付きバックアップを作成する | mv ファイル名 ファイル名.$(date +%Y%m%d) |
| 拡張子を一括変更する | rename .log .log.bak *.log |
mvコマンドを「安全に」使いこなせていますか?
mvは便利ですが、一歩間違えると大事なファイルを上書きして失うリスクがあります。オプションを正しく理解し、バックアップの習慣を身につけることが、サーバー運用の第一歩です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
<<関連記事>>
・pstree
・chsh
・finger
・duコマンドでディスク使用量を確認する方法|ディレクトリごとの容量や容量順ソートも
・LinuxのOSバージョンを確認するコマンド|uname・os-release・hostnamectlの使い方
