目录的时间戳?

目录的时间戳?
  1. 关于目录的 mtime,来自 Stéphane Chazelas 的回复 https://unix.stackexchange.com/a/187231/674

    与任何其他文件一样,目录的修改时间(请注意目录如何称为目录(名称/号码映射的列表,如电话簿)而不是文件夹)在内容修改时都会更新。

    即在其中添加(链接)、删除(取消链接)或重命名文件的时间。

    这是否意味着目录中有关子文件的内容只是子文件的文件名以及子文件的硬链接数量?

    如果不是,父目录的内容中还有哪些子文件的其他信息?

    换句话说,更改子文件的什么内容也会更改其父目录的 mtime?

  2. 目录的atime什么时候改变?我发现 ls -lls -ld和都没有cd更改目录的 ctime 。我认为命令显示目录的内容,因此读取目录的内容?

  3. 目录的ctime什么时候改变?

谢谢。

答案1

将目录视为一个文本文件,如下所示:

123:foo.txt
234:bar.txt
123:other-name-for-foo.txt

这就是全部(至少在传统的 Unix 文件系统中)。

foo.txt不是一个孩子该目录的名称,因为它不是排他关系。只是索引节点号为 123 的文件在该目录的两个条目中被引用:withfoo.txtother-name-for-foo.txt

这两个目录条目也称为两个难的链接到同一文件。

$ touch foo.txt bar.txt
$ mkdir other-dir
$ ln foo.txt other-name-for-foo.txt
$ ln foo.txt other-dir/whatever
$ ls -i . other-dir
.:
58892735 bar.txt  58958143 other-dir/
58879562 foo.txt  58879562 other-name-for-foo.txt

other-dir:
58879562 whatever

.other-dir两个类型的文件目录,每个包含多个目录条目。ls列出名称不以 开头.-i包含索引节点号的目录条目。

使用-a(包括点文件)和-ils -ai),这或多或少地转储了该内容文本文件我上面已经提到了。

您会注意到上面的 inode 58879562 文件一次链接到 ,other-dir两次链接到.。该 58879562 文件现在的链接计数为 3,但他们也不.关心other-dir这一点。该信息存储在文件的索引节点中,仅供系统跟踪文件链接到目录的次数。如果该数字降至 0,则可以回收该文件占用的磁盘空间。

除了 inode 编号和名称之外,目录还包含文件的文件类型(常规/fifo/directory/symlink/device...,但不适用于所有文件系统)。该信息可以通过其他方式检索(因为它存储在索引节点中),因此没有必要。这样做主要是为了优化目的并且因为它是可能的。这是可能的,因为无法更改文件的类型(与其他元数据相反),因此存储在目录中的信息不会与现实不同步。

您还会注意到,删除文件的系统调用不是remove("/foo/bar")but unlink("/foo/bar")。那是因为它所做的只是bar/foo目录中删除条目,它取消链接 bar/foo。该文件可能仍然链接到其他(或不同名称的相同)目录。只有当它的链接计数达到零时(当它不再链接到任何目录时),它才会被删除。

至于为什么执行 an 操作ls不会更新目录的访问时间,这可能是因为您的文件系统是使用noatimeorrelatime选项挂载的。

每次读取文件(目录或其他)时更新其访问时间的成本很高,因此现在许多系统放弃了这种做法。

请注意,系统(如果不是用户)始终会读取目录。

例如,当访问 时/foo/bar,系统需要读取 的内容/来查找foo,然后/foo再查找bar(尽管大多数时候该信息被缓存)。然而,在这些情况下,atime 不会更新(值得庆幸的是),仅当用户空间进程时明确地像这样读取目录的内容ls

至于ctime目录的 目录何时更新,与常规文件相同:修改其内容(添加、删除或重命名条目)或其元数据(atime读取时除外)(例如chmod/ chown、ACL 修改)。 ..)。

相关内容