この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:7
ページ更新者:guest
更新日時:2026-06-11 07:10:02

タイトル: mv ファイル/ディレクトリの移動および名称変更
SEOタイトル: Linux mv コマンド完全ガイド

この記事の要点
  • 移動: mv src dest / 改名: mv old new(同じコマンド)
  • 上書き制御: -i(確認) / -n(しない) / -f(強制) / -u(新しい時のみ)
  • 複数ファイル一括移動: mv *.log archive/(最後の引数がディレクトリ)
  • 進捗確認: -v / バックアップ: --backup=numbered
  • 一括リネーム: rename コマンド(Perl rename / util-linux rename)が便利

mv コマンドの基本

ファイル / ディレクトリの移動と改名を行う UNIX 標準コマンド。実態は "古いパスから新しいパスへの操作" なので、移動も改名も同じコマンドです。

# 1. 改名(同じディレクトリ内)
mv old.txt new.txt

# 2. 別ディレクトリへ移動
mv file.txt /tmp/

# 3. 移動と同時に改名
mv old.txt /tmp/new.txt

# 4. ディレクトリの移動・改名
mv project/ /opt/
mv project/ webapp/

# 5. 複数ファイルを 1 ディレクトリへ
mv *.log archive/
mv a.txt b.txt c.txt destdir/

主なオプション

オプション動作
-i / --interactive上書き前に確認
-n / --no-clobber既存ファイルがあれば飛ばす
-f / --force確認なしで上書き
-u / --update移動先より新しい場合だけ移動
-v / --verbose移動を逐次表示
-b / --backup上書き時にバックアップ作成
--backup=numberedバックアップに連番付与
-t DIR移動先を先に指定(複数ソース用)
-T移動先をディレクトリとして扱わない
--no-target-directory-T と同じ

上書き挙動の制御

同名ファイルがある場合のデフォルト動作はディストリビューションによって異なります。多くの環境では alias mv='mv -i' がエイリアスされていて確認プロンプトが出ます。

# 確認プロンプト
mv -i src.txt dest.txt
# mv: overwrite 'dest.txt'? y

# 既存があれば飛ばす(バッチ処理用)
mv -n src.txt dest.txt

# 強制上書き(エイリアスを無効化したい場合)
\mv src.txt dest.txt          # バックスラッシュで alias 回避
/bin/mv src.txt dest.txt      # フルパス指定

# 新しい時だけ上書き(rsync 的)
mv -u src.txt dest.txt

複数ファイル / ディレクトリの一括移動

# パターン展開
mv *.log archive/
mv file_{1..10}.txt destdir/    # Brace 展開
mv 2024-*.csv old/

# -t で移動先を先に指定(xargs と相性が良い)
find /var/log -name "*.gz" -mtime +30 \
  | xargs mv -t /archive/old/

# 同名衝突を避けつつ全部移動
mv -n *.txt destdir/

# 進捗確認
mv -v *.log archive/
# 'a.log' -> 'archive/a.log'
# 'b.log' -> 'archive/b.log'

ディレクトリ移動の注意

# 既存ディレクトリへ移動 → その中に入る
mv src/ dest/
# → dest/src/ になる

# ディレクトリを改名(移動先が存在しない)
mv src/ newname/
# → newname/ にリネーム

# 注意: 末尾スラッシュの有無
mv a/ b/     # a の中身を b へ? a を b にリネーム?
             # → b が存在すれば b/a/ に入る、なければ b にリネーム

# 明示的に「ディレクトリとして扱わない」
mv -T src/ dest/

ファイルシステムをまたぐ移動

同じファイルシステム内なら mv は瞬時(メタデータ更新のみ)です。別ファイルシステム間(例: / から USB へ)の場合は内部的に cp + rm になり、巨大ファイルだと時間がかかります。

# 確認: 同じファイルシステムかどうか
df -h /src /dest
# → Filesystem 列が同じなら瞬時、違えば cp + rm

# 進捗バー付きで移動したい場合(rsync 推奨)
rsync -ah --progress --remove-source-files /src/ /dest/
find /src -depth -type d -empty -delete   # 空ディレクトリ掃除

# pv で進捗
pv bigfile.bin > /mnt/usb/bigfile.bin && rm bigfile.bin

大量ファイルの一括リネーム

mv 単体では正規表現置換ができないため、シェルループや rename コマンドを使います。

# .txt → .bak 一括変更(シェル)
for f in *.txt; do
  mv -- "$f" "${f%.txt}.bak"
done

# Perl rename(Debian/Ubuntu の rename, file-rename パッケージ)
rename 's/\.txt$/.bak/' *.txt
rename 'y/A-Z/a-z/' *      # 大文字→小文字
rename -n 's/foo/bar/' *   # ドライラン(-n 確認)

# util-linux rename(RHEL/CentOS 標準)
# 構文: rename FROM TO FILES
rename .txt .bak *.txt
# ※ Perl rename と util-linux rename は別物。引数仕様も異なる
which rename               # どちらか確認
rename --version

# Python の高機能版
sudo apt install rename    # Perl 版

Perl rename と util-linux rename の違い

項目Perl renameutil-linux rename
主な配布Debian / UbuntuRHEL / CentOS / Fedora
構文rename 'PERL式' FILESrename FROM TO FILES
正規表現強力(Perl)単純な文字列置換のみ
rename 's/foo/bar/' *rename foo bar *
ドライラン-n無し

Linux mv と Windows move の比較

項目Linux mvWindows move (cmd)
基本mv src destmove src dest
強制上書き-f/Y
確認-iデフォルトで確認
ワイルドカードシェル展開move *.log archive\
PowerShell 相当Move-Item src dest -Force

典型的なトラブル

症状原因対処
mv: cannot stat 'foo'ソースが存在しないパス再確認
mv: cannot move 'a' to 'a/b'サブディレクトリへ移動論理エラー、別 dest を指定
Permission denied移動先ディレクトリ書込権限なしsudo / 権限修正
Invalid cross-device linkmv は自動 cp + rm にフォールバック
巨大ファイル移動が遅い別ファイルシステムrsync で進捗確認

FAQ

Q: mv を取り消したい(元に戻す)
A: mv に「undo」はありません。重要操作前に -i--backup、または cp -a でコピーしておくのが安全。誤って上書きしたら extundelete 等の復元ツール頼み。

Q: ファイル名に空白や特殊文字が含まれる
A: クォートする: mv "my file.txt" dest/。ハイフン始まりは -- で区切り: mv -- -filename.txt dest/

Q: 巨大ディレクトリの移動中にエラーで止まった
A: 中途半端な状態になります。rsync なら --remove-source-files + 中断耐性で安全。