2つの質問に対する回答に基づいてより早い 質問、それ〜らしいRHEL/CentOS 7ではmv
同じファイルシステムでcp
あってもrm
。
以前のバージョンのCentOS / RHELでは、mv
大容量ファイル(インストールメディアや大容量ビデオコレクションなど)で作業している場合でも、同じファイルシステム(ディープディレクトリから新しいディープディレクトリに移動しても)は非常に高速でした。
しかし、私の個人的なCentOSサーバーでは、mv
大容量ファイルを移動するときに実際に何が起こるのかを見てcp
くださいrm
。
これはなぜこの動作がラッパーからrename()
(によると)に変更されたのか疑問に思います。POSIX基準)。
そうですか?それでは、mv
このユーティリティがCentOS 7の動作を変更するのはなぜですか?
ベストアンサー1
CentOS 7.2mv
コマンドはその呼び出しを使用しようとしますrename(3)
。
たとえば、これを行うと、strace mv X Y
出力に次のように表示されます。
rename("X", "Y") = 0
mv
これにより、名前変更呼び出しが成功したことを確認できます。
このディレクトリの名前を別のディスクに変更しようとすると、次のようになります。
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()
失敗した場合にのみ遅いバージョンに戻ると結論付けることができます。