是否mv
表现cp(1)
为进程移动许可被拒绝?
如果是的话,做一件事并把它做好,这不是违反规则吗?
答案1
简短的回答是不会。
执行相当于
rename()
功能
rename()
不复制内容,它只是在磁盘上重命名它。这是一个完全原子的操作,永远不会部分完成失败。
然而,这并不能说明全部情况。这个效果在哪里能尝试在设备之间移动文件时会发生这种情况:在这种情况下,无法在文件系统中进行重命名。要达到移动的效果,mv
请先将源复制到目标,然后删除源。实际上,mv /mnt/a/X /mnt/b/Y
本质上相当于cp /mnt/a/X /mnt/b/Y && rm /mnt/a/X
。这是在设备之间移动文件的唯一方法。
当mv
没有权限删除该源文件时,会报告错误,但此时复制已经发生。通过提前检查权限是不可能避免这种情况的,因为可能会出现权限在操作期间发生变化的竞争条件。
除了完全无法在设备之间移动文件之外,确实没有办法阻止这种可能发生的情况。在一般情况下,允许mv
在任何源和目标之间进行选择会使事情变得更简单,但代价是在这些不寻常的情况下出现奇怪(但非破坏性)的行为。
这也是为什么在单个设备中移动大文件比将其移动到另一个设备要快得多的原因。