通常,您实际上不会在 vim 中编辑文件。 如果您运行 vim foo
、编辑、写入和退出,vim 会取消链接foo
并创建一个新文件和一个名为 foo
的新链接。 但是,如果文件有多个链接,则vim
实际上会修改该文件。 例如:
$ ls -i foo
19428852 foo
$ vi foo
$ ls -i foo
19428857 foo
$ ln foo bar
$ vi bar
$ ls -i bar
19428857 bar
我一直在寻找一种实际编辑文件的方法,似乎有两种选择。 使用 ed
或使用 vim
但在编辑之前确保至少有两个指向该文件的链接。 我想这个问题是学术性的,因为如果只有一个链接,vim 创建一个新文件并不重要,如果在编辑过程中创建链接,vim 似乎做了正确的事情,但我很好奇:
是否可以使 Vim 始终编辑文件,而不创建新文件?
查看backupcopy
选项的帮助,特别是有关crontab
的说明。 简短的回答是
:set backupcopy=yes
快速谷歌显示此链接 - 编辑文件的硬链接。控制它的命令
set backupcopy=auto,breakhardlink
诀窍是告诉 Vim 使用备份文件来安全地覆盖原始文件,否则 Vim 会写入一个新文件,然后重命名它以替换原始文件。
然后告诉 Vim 无处写入备份文件。这样,常规写入命令将失败,必须强制写入。
:set noswapfile
:set backupcopy=yes
:set backupdir=''
:e big
(hit Crtl-C to stopo line count and syntax highlight)
(edit the file)
:w!
为了真正了解文件系统级别发生了什么,我使用了inotice工具:
inotifywait -m -r /path/to/my_test_dir/
但要小心,这对于非常大的文件效果不佳,例如,我试图使用此方法就地编辑 10G 文件,最终得到 1.5GB 的截断文件,其余数据丢失。而 Vim 最终使用了近 2GB 的内存......
另一种选择是使用MMap函数,例如在Python命令行中。