很多用于同步文件的工具都不太适合同步您的主目录。因此,为了学习Ruby,我一直在开发自己的同步工具。
我在同步工具中遇到的一个问题是,当用户重命名一个文件或删除一个文件时会发生什么。考虑到第一种情况(如果用户重命名),有什么方法可以告诉我,这不是一个新文件,而是一个已经重命名的文件?也许是我不知道的文件的唯一ID。文件描述符听起来像是要研究的东西,但我很确定这是一个不同的概念。
发布于 2016-06-20 23:29:43
无法确定文件是否已被重命名。
当一个文件被重命名时,它的inode号不会改变。(对于“外来的”文件系统(如网络文件系统)可能不是这样,但是对于所有“本机”Unix文件系统都是如此。)然而,相反的情况是不正确的:如果一个文件被删除,一个新的文件可以用相同的inode号创建。因此,即使您看到一个文件具有与另一个文件相同的inode编号,这也不一定意味着该文件已被重命名。
inode编号在文件存在时唯一标识该文件。这使得它适合于检测硬链接,但不适合检测重命名。
文件描述符与特定的进程相关联,在这里是无用的。
您可能会考虑这样一个启发:如果一个文件的大小、修改时间和inode号与以前相同,但是名称不同,那么它就意味着它已经被重命名了。这种启发类似于许多同步工具用于检测未更改的文件:相同的名称、大小和修改时间。
我能想到的所有工具都是基于文件的内容重命名的。和声检测重命名的文件如果至少有一个端点是远程的。一些现代版本控制系统,如git,也检测重命名的文件。
发布于 2016-06-20 21:50:12
文件描述符是在程序打开文件时为它创建的,并且只在程序再次关闭之前才有效。正如你所怀疑的:一个不同的概念。
如果文件被重新命名为inode(s)不会更改,您可以使用它,但是除非经常发生重命名,否则我怀疑它是否值得。
https://unix.stackexchange.com/questions/290996
复制相似问题