当您 移动 ,文件本身( inode )根本不会移动。唯一更改的是该文件系统中的目录条目。(mv
在这种情况下,由调用的系统调用是rename(2)
-检查该页面以获取其他信息和限制。)
当进程打开文件时,文件名将传递到操作系统以指示文件的含义,但是您返回的文件描述符根本没有链接到该名称(您无法从文件名中获取文件名)–它链接到索引节点。 由于在重命名文件时(在同一文件系统内)索引节点保持不变,因此打开该索引的进程可以很高兴地继续对其进行读取和写入操作- 对它们没有任何更改,它们的文件描述符仍然有效并指向正确的数据。
如果删除文件,也是一样。即使文件无法通过任何目录条目访问,进程也可以继续对其进行读写。(这可能会导致令人困惑的情况,即df
报告磁盘已满,但du
表示您使用的df
报告空间要少得多。分配给仍打开的已删除文件的块只有在这些进程关闭其文件描述符后才会释放。 )
如果在mv
文件系统之间移动文件,则行为会有所不同,因为inode特定于每个文件系统。在这种情况下,mv
将实际复制数据,从而在目标文件系统上创建一个新的inode(和目录条目)。复制结束后,旧文件将取消链接,如果 上面没有打开的文件句柄,则将其删除,如上所述。 就您而言,如果您跨越了文件系统边界,则目标中将包含部分文件。并且您的上传过程愉快地写入了您无法轻松访问的已删除文件,可能会填满该文件系统,直到上传完成,此时索引节点将被删除。
您会在Unix和Linux上发现一些有趣的帖子: