UNIX 命令 mv 和 rm 如何处理打开的文件?

Posted

技术标签:

【中文标题】UNIX 命令 mv 和 rm 如何处理打开的文件?【英文标题】:How do the UNIX commands mv and rm work with open files? 【发布时间】:2011-07-10 08:17:57 【问题描述】:

如果我正在读取存储在 NTFS 文件系统上的文件,并且我尝试在该文件仍在读取时移动/重命名该文件,我将无法这样做。如果我在 EXT3 等 UNIX 文件系统上尝试此操作,它会成功,并且执行读取的进程不受影响。我什至可以 rm 文件并且读取过程不受影响。这是如何运作的?有人可以向我解释为什么在 UNIX 文件系统下支持这种行为但在 NTFS 下不支持?我有一种模糊的感觉,它与硬链接和索引节点有关,但我希望能有一个很好的解释。

【问题讨论】:

【参考方案1】:

Unix 文件系统使用引用计数和两层架构来查找文件。

文件名是指称为inode 的东西,用于信息节点或索引节点。 inode 存储(指向)文件内容以及一些元数据,例如文件的类型(普通、目录、设备等)以及谁拥有它。

多个文件名可以引用同一个inode;然后他们被称为hard links。此外,file descriptor (fd) 指的是一个 inode。 fd 是进程打开文件时获取的对象类型。

Unix 文件系统中的文件只有在最后一次引用它时才会消失,因此当没有更多名称(硬链接)或 fd 引用它时。所以,rm 实际上并没有删除文件;它删除了对文件的引用

这种文件系统设置可能看起来令人困惑,并且有时会带来问题(尤其是 NFS),但它的好处是,对于许多应用程序来说,锁定不是必需的。许多 Unix 程序也利用这种情况打开一个临时文件并在之后立即删除它。一旦它们终止,即使它们崩溃,临时文件也会消失。

【讨论】:

我可以移动打开文件的位置是否有任何限制?例如。只能在同一个文件系统中? @ivan_pozdeev 对跨不同文件系统的文件执行 mv 实际上会复制数据并删除原始文件,在这种情况下,它类似于打开文件的 rm【参考方案2】:

在 unix 上,文件名只是指向实际文件(inode)的链接。打开文件还会创建到实际文件的(临时)链接。当一个文件的所有链接都消失(rm 和 close())时,该文件被删除。

在 NTFS 上,逻辑上文件名文件。从文件名到文件元信息没有间接层,它们是同一个对象。如果你打开它,它正在使用中并且不能被删除,就像在 unix 上的实际文件(inode)在它使用时不能被删除一样。

Unix:   文件名 ➜ FileInfo ➜ 文件数据

NTFS: FileName + FileInfo ➜ 文件数据

【讨论】:

以上是关于UNIX 命令 mv 和 rm 如何处理打开的文件?的主要内容,如果未能解决你的问题,请参考以下文章

文件删不掉 Operation not permitted,该如何处理

rm,cp,mv命令的参数列表太长错误

我可以/应该如何处理这个 git gc 错误? (rm:无法取消链接包权限被拒绝)

mac系统目录结构

Linux中的find和grep命令对查找到的文件如何处理啊

linux下,文件名带括号如何处理