我使用Vim8.2来编辑Ubuntu18.04中的文件。当我打开一个文件,做一些更改并退出Vim时,这个文件的inode编号将被更改。
据我理解,这是因为启用了Vim的备份机制,因此每个版本都将创建一个新文件(.swp文件)来替换旧的文件。一个新文件有一个新的inode编号。就这样。
但我发现了一些奇怪的东西。
如下面所示,在第一个vim 11.cpp之后,inode发生了变化,409980变成了409978。但是,在为文件11.cpp创建了一个硬链接之后,无论我如何用Vim修改文件11.cpp,它的inode编号都不会改变。如果我删除硬链接xxx,它的inode编号将被我的Vim的每一个版本再次更改。
这真的让我很困惑。
$ ll -i ./11.cpp
409980 -rw-rw-r-- 1 zyh zyh 504 Dec 22 17:23 ./11.cpp
$ vim 11.cpp # append a string "abc" to the file 11.cpp
$ ll -i ./11.cpp
409978 -rw-rw-r-- 1 zyh zyh 508 Dec 22 17:25 ./11.cpp
$ vim ./11.cpp # remove the appended "abc"
$ ll -i ./11.cpp
409980 -rw-rw-r-- 1 zyh zyh 504 Dec 22 17:26 ./11.cpp
$ ln ./11.cpp ./xxx # create a hard link
$ ll -i ./11.cpp
409980 -rw-rw-r-- 2 zyh zyh 504 Dec 22 17:26 ./11.cpp
$ vim 11.cpp # append a string "abc" to the file 11.cpp
$ ll -i ./11.cpp
409980 -rw-rw-r-- 2 zyh zyh 508 Dec 22 17:26 ./11.cpp
$ vim 11.cpp # remove the appended "abc"
$ ll -i ./11.cpp
409980 -rw-rw-r-- 2 zyh zyh 504 Dec 22 17:26 ./11.cpp发布于 2020-12-22 10:29:21
backupcopy的设置似乎是auto (在Vim中运行:set backupcopy?以确认)。
主要的值是:
yes复制文件并覆盖原始的no重命名文件,并编写一个新的auto(前一个),auto值最好的是中间方式:当Vim看到重命名文件是可能的,而没有副作用(属性可以传递,文件不是链接)。当出现问题时,将复制一份。
如果不清楚:yes (复制和覆盖)不更改inode编号,no (重新命名和写入)会更改它。
在您的情况下,auto最初类似于no。在ln ./11.cpp ./xxx Vim 注意到之后,还有另一个链接,auto像yes一样工作。
发布于 2020-12-22 10:28:47
通常,当您启用备份时,最有效的方法是重命名原始文件并创建一个具有编辑更改的新文件。
但是,当目标文件有多个硬链接时,这不是正确的做法,因此vim采取了一种效率较低的方法,即编写与原始文件匹配的备份文件,然后就地更新原始文件。
发布于 2020-12-22 12:10:05
我复制了一遍,然后思考如果inode号改变会发生什么。
这表示编辑器创建了一个新文件并删除了旧文件。可能会重新命名,以减少数据丢失的风险。如果它对一个具有多个名称的文件执行此操作,则当它移除旧名称(该文件是用该文件打开的那个名称)时,另一个名称将保持不变,并仍然指向旧文件。
注意:没有硬链接这样的东西。只有指向元数据和文件内容的inode。还有(通常)一个或多个文件名指向inode。这些名称中的每一个都具有相同的状态(nether是一个硬链接,它们只是指向inode的名称)。
https://unix.stackexchange.com/questions/625651
复制相似问题