Answers:
如果在同一文件系统上移动目录,则只能将目录条目从文件系统中的一个位置移动到另一位置。例如,mv /source/dir /target/dir
将删除的目录条目dir
从/source
并创建一个新的/target
。这是通过一个原子系统调用(即不间断的)完成的。包含目录条目及其目录dir
实际内容的索引节点不受影响。
如果将目录从一个文件系统移动到另一个文件系统,则首先将所有文件复制到新文件系统,然后再与原始文件系统取消链接。因此,如果mv
在复制时中断,则可能会得到一些文件的两个副本-在旧位置和新位置。
strace mv /fs1/dir /fs2/
-在最后一件事 MV确实是调用unlinkat
(一个,因为他们被复制而不是一个)上的所有源文件一次。
GNU实现在命令行上的参数上进行迭代,尝试首先重命名,如果失败,则递归复制,然后递归删除源。所以
mv a b c/
将删除一个复制之前b,并且不会开始删除任何一个之前目的地复制完成。
请注意,这仅适用于GNU实现。
需要说明的是:如果a是包含d和e的目录,并且b是文件,则顺序为
mv
,因此它不仅限于GNU。
您移动一个目录,中断移动,原始目录将保持不变:
$ mv a b/
如果您移动多个目录,则每个目录在源或目标上都将保持完整,这取决于您中断的时间:
$ mv a b c/
我如何得到答案:
$ mv --version
mv (GNU coreutils) 8.21
$ info mv
... It first uses some of the same code that's used by `cp -a'
to copy the requested directories and files, then (assuming the copy
succeeded) it removes the originals. If the copy fails, then the part
that was copied to the destination partition is removed. If you were
to copy three directories from one partition to another and the copy of
the first directory succeeded, but the second didn't, the first would
be left on the destination partition and the second and third would be
left on the original partition.
作为测试,我将一个大文件夹复制到了NFS目录中,中断了,并且我的源大文件夹中的文件数保持不变,并且部分内容保留在NFS目录中。我使用“查找。-type f | wc -l”进行验证。
看起来西蒙的答案是正确的。
否。mv逐个对象地操作,因此已经处理过的对象将从源中删除。
如果由于要断开与终端的连接而要中断mv,则可以将其发送到后台:
* press Ctrl+Z
# bg
# disown
fsck
(由于未彻底卸载磁盘,因此该文件很可能会在重新启动时自动运行)。