答案1
CentOS 7.2mv
命令将尝试使用该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()
调用,只有在失败时才回退到慢速版本。