当我使用 sublime 时,并且没有进行任何更改,则编辑器中的图标显示文件未更改。
但是,如果我单击保存它,它仍然将文件系统 mtime 时间设置为现在。
不变的保存真的应该更新“修改”时间吗?
简单的例子:
创建一个空文件
$ touch example.file
$ stat -l example.file
-rw-r--r-- 1 matthew staff 0 Jul 9 14:45:41 2013 example.file
触摸它会更新 mtime
$ touch example.file
$ stat -l example.file
-rw-r--r-- 1 matthew staff 0 Jul 9 14:45:57 2013 example.file
编辑它,但不做任何更改,也会更新 mtime
$ vim example.file
# :wq # write and quit, making no changes
$ stat -l example.file
-rw-r--r-- 1 matthew staff 0 Jul 9 14:46:10 2013 example.file
答案1
不变的保存真的应该更新“修改”时间吗?
是的,因为当应用程序写出文件时,操作系统会将该数据写入磁盘。它可能与文件中已有的数据完全相同,但操作系统不会检查或关心这是否属实。当然,文本编辑器希望不会天真地为每次保存写入整个文件,因为我保存非常频繁,并且不希望毫无意义地磨损磁盘(也许操作系统的文件缓存和同步可以改善这一点,因此应用程序不会不得不担心)。
许多应用程序(包括 vim)会注意到它们加载的文件是否在外部发生更改,并通知用户。我本以为他们是基于 mtime 来做到这一点的,但是快速检查touch
表明至少在 vim 的情况下,事情并不是那么简单(引出 vim 如何知道已进行更改的问题 - 也许如果 mtime 已更改)比较两个版本的哈希值?)。我的观点是,如果应用程序正在监视文件的外部更改,那么它应该能够安全地保存更改,而无需重写整个文件(再次:希望如此)。在这种情况下,您可能会认为保存未更改的文件可能意味着什么也不做。然而,由于用户确实要求保存(即使用户知道或可以知道是否有必要),那么在我看来,应用程序至少应该触摸文件以反映这一点。如果,例如,它可能是有价值的。您依赖时间戳来反映上次更新,即使此更新毫无意义。
毕竟,如果你不如果想要更改时间戳,则不必保存未更改的文档。