Directory 哪些操作应该更改目录的修改日期?

Directory 哪些操作应该更改目录的修改日期?,directory,operating-system,filesystems,Directory,Operating System,Filesystems,我正在编写一个工具,可以备份或合并目录 文件的修改日期有些简单,但是目录的修改日期呢 哪些操作被视为目录的修改?(然后我会调用操作系统的API来实现这一点。) 基于操作系统和文件系统的预期语义有何区别? 是否由通用第三方程序持续更新 常见的第三方程序是否依赖于目录修改日期的特定语义?(示例:增量备份程序是否会递归到声明相同修改日期的目录中?) 补充: 下面是另一个例子(尽管我更喜欢更广泛的范围): 当我将一个目录从一个驱动器复制到另一个驱动器时:实际发生的是,首先创建最外层的目录,然后递归地向下

我正在编写一个工具,可以备份或合并目录

文件的修改日期有些简单,但是目录的修改日期呢

哪些操作被视为目录的修改?(然后我会调用操作系统的API来实现这一点。)

基于操作系统和文件系统的预期语义有何区别? 是否由通用第三方程序持续更新

常见的第三方程序是否依赖于目录修改日期的特定语义?(示例:增量备份程序是否会递归到声明相同修改日期的目录中?)

补充:

下面是另一个例子(尽管我更喜欢更广泛的范围):
当我将一个目录从一个驱动器复制到另一个驱动器时:实际发生的是,首先创建最外层的目录,然后递归地向下添加各个文件。默认情况下,添加的任何目录的最后一个条目将更改该目录的修改日期。结果是,每个目录都将有一个全新的修改日期,该日期几乎没有信息价值(并且与源目录的日期不同)。一个问题是我们是否希望如此,还是希望随后将该目录的修改日期更改为与源驱动器上目录的修改日期相同

当您意识到目录也是文件时,这一点很明显,因此任何更改目录内容的操作都会更新其修改时间。由于目录的内容是文件名,因此目录中的任何输入操作(创建、mkdir、rmdir、取消链接等)都将更新其mtime。您还可以使用
utime(2)
syscall手动设置atime和mtime


Linux上的文件系统和各种Unix操作系统变体上都是如此。

您没有指定操作系统或文件系统,并且这些系统或文件系统具有不同的操作,因此出于说明目的,我们将采用“修改时间”,并且在“修改时间”之前,我们假设讨论的是mtime(而不是ctime)

POSIX起源于Unix,在Unix中,正如@itisravi所说,目录只是另一种类型的文件

这意味着两件事:

  • 更改文件的mtime并且可以在目录上调用的每个系统调用都可以更改目录的mtime
  • 修改目录inode数据内容的每个系统调用,即文件名列表或与列表中的文件名关联的inode编号,都将更改目录的mtime
在第一类中,我们有和它的变体,如

在第二类中,我们有,,,到unix域套接字,,,及其变体

所有这些指向规范的链接都有相关部分,说明何时必须更新mtime

他们没有的是任何关于mtime何时不应更改的规范。这意味着文件系统基本上可以随时将mtime更改为它想要的任何内容。为什么要做这样的事?以下是几个例子:

  • 后台任务,例如删除旧文件
  • 管理员将文件系统恢复到较旧的快照
  • 如果不更新mtime,就无法有效地在后台优化或更正错误的实现问题
  • (但请注意,NFS不符合POSIX)
但是,在您正在编写的工具(的克隆?)的上下文中,还有其他注意事项:

  • 元数据很重要。如果有人在一个目录中浏览了一个文件,它不会改变目录的修改时间,但是您仍然需要进入目录并在那里做一些事情
  • 某些工具,例如
    cp-a
    or,在复制数据时,默认情况下会复制元数据。源数据的元数据确实比新创建的数据的元数据有用得多
  • 合并目录时,需要确定mtime设置的一致定义。“两个目录中的最新目录”可能是最普遍适用的定义
  • 除了像rsync这样的备份工具(听起来与您正在做的事情类似)之外,还有另一类对检测更改感兴趣的工具—构建工具。类似的工具,但这是“旧的方式”,新的构建工具散列他们复制的数据,而你可能会想考虑这个选项。