2つの答えに照らして 前質問 、それはRHEL/CentOS 7の下でのようです同じファイルシステム上でもmv
は実際にはcp
を実行してからrm
を実行します。
CentOS/RHELの以前のエディションでは、同じファイルシステム上のmv
(ディープディレクトリから新しいディープディレクトリまで)は、大きなファイル(インストールメディアや大きなビデオのコレクションなど)でも非常に高速でした。
しかし、私の個人的なCentOSサーバーでは、大きなファイルを移動するときにmv
が実際に何をしているのかを見ると、cp
の後にrm
が続くのと同じくらい時間がかかります。
これは、なぜ動作が単なるラッパーからrename()
に変わったのか不思議に思います( [〜#〜] posix [〜#〜] 標準による)。
これは正しいです?もしそうなら、なぜmv
ユーティリティがCentOS7の動作を変更したのですか?
CentOS 7.2 mv
コマンドは、rename(3)
呼び出しを使用しようとします。
たとえば、_strace mv X Y
_を実行すると、出力に表示されます
_rename("X", "Y") = 0
_
したがって、mv
が正常にrenameと呼ばれていることがわかります。
代わりに、このディレクトリの名前を別のディスクに変更しようとした場合:
_rename("X", "/home/sweh/X") = -1 EXDEV (Invalid cross-device link)
_
mv
がrename()
呼び出しを使用しようとしましたが、失敗したことがわかります。この時点で、再帰的な作業を開始します
_rmdir("/home/sweh/X") = -1 ENOENT (No such file or directory)
mkdir("/home/sweh/X", 0700) = 0
lstat("/home/sweh/X", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
openat(AT_FDCWD, "X", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
getdents(3, /* 2 entries */, 32768) = 48
_
ここでは、ターゲットディレクトリが作成され、現在のディレクトリの読み取りを開始して、低速のコピー/削除を実行していることがわかります。
したがって、mv
は高速のrename()
呼び出しを使用しようとし、これが失敗した場合にのみ低速バージョンにフォールバックすると結論付けることができます。