![为什么unix文件系统不存储文件的创建时间?](https://linux22.com/image/85145/%E4%B8%BA%E4%BB%80%E4%B9%88unix%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E4%B8%8D%E5%AD%98%E5%82%A8%E6%96%87%E4%BB%B6%E7%9A%84%E5%88%9B%E5%BB%BA%E6%97%B6%E9%97%B4%EF%BC%9F%20.png)
有什么历史原因吗?Stat
存储上次访问时间、上次修改时间和上次更改时间,但不存储创建时间!这不是很重要的信息吗?
我不明白为什么开发人员会遗漏如此重要的信息。某些文件系统确实存储数据,如此处所示问题。但显然这些信息的重要性被低估了。为什么会这样呢?
笔记:
stat -c %W <filename>
在我的系统(fedora 22)中返回 0。
答案1
历史的答案当然是它最初不存储创建时间,并且没有人觉得有必要添加这个新功能。
不存储创建时间有一个很好的理由,那就是这是一个定义非常不明确的概念。如果系统记录某个时间并将其称为“创建时间”,那么在很多情况下这不是一个有用的时间。
许多应用程序通过首先写入临时文件,然后重命名该文件以覆盖旧文件来保存文件。这种方法比就地覆盖文件更可取,因为如果应用程序或系统在写入文件时崩溃,这只会留下临时文件,而覆盖方法会在原地留下损坏的文件。但这种方法意味着,如果将文件的创建时间定义为文件实际创建的日期,那么大多数数据文件的创建时间将与其修改时间相同,或者仅过去几分之一秒。所以创建时间不会提供任何信息。
这可以通过要求应用程序以某种方式声明新文件实际上是旧文件的新版本来更改,因此应该继承其创建时间。但这需要大量额外的复杂性,不像传统的时间戳(内容修改、访问和索引节点更改),传统时间戳可以自动更新(在每次写入、每次读取、每次元数据更改时)。
在其他情况下,创建时间是有争议的。当您复制包含保留元数据( cp -p
、 、 ...)的文件时rsync -a
,您是在创建副本,还是在复制包含其创建时间的文件?从备份恢复文件时,应该恢复创建时间还是恢复时间?
如果您想让文件的创建时间有意义,请将其输入到版本控制下。然后您可以将创建时间定义为包含该文件的第一次提交的时间,并且该信息将被记录和保留。
答案2
现代文件系统确实存储文件对象的创建时间。没有提前完成的原因之一可能是对于文件创建时间应该是多少没有达成共识,即是在文件对象(inode)创建时还是文件内容(数据)创建时,以及文件创建时做什么从备份中恢复。