当您在 *nix 中创建新目录时,会创建多少个条目?

当您在 *nix 中创建新目录时,会创建多少个条目?

我认为mkdir ~/a要么是两个,要么是三个:

  • 其所在目录有 1 个条目 ( ~/a)
  • 本身有 1 个条目 ( cd a && ls .)
  • 和/或再次为自己添加 1 个条目 ( cd a && ls ..)

有人可以澄清一下这是两个还是三个吗?

答案1

在空目录中:

% stat .
  File: `.'
  Size: 6               Blocks: 0          IO Block: 4096   directory
Device: fe04h/65028d    Inode: 537317737   Links: 2
Access: (0750/drwxr-x---)  Uid: ( 1000/stribika)   Gid: (  100/   users)
Access: 2011-02-22 08:47:20.935036074 +0100
Modify: 2011-02-22 08:47:20.935036074 +0100
Change: 2011-02-22 08:47:20.935036074 +0100
 Birth: -
% mkdir foo
% stat .
  File: `.'
  Size: 16              Blocks: 0          IO Block: 4096   directory
Device: fe04h/65028d    Inode: 537317737   Links: 3
Access: (0750/drwxr-x---)  Uid: ( 1000/stribika)   Gid: (  100/   users)
Access: 2011-02-22 08:47:20.935036074 +0100
Modify: 2011-02-22 08:47:57.465036072 +0100
Change: 2011-02-22 08:47:57.465036072 +0100
 Birth: -
% stat foo
  File: `foo'
  Size: 6               Blocks: 0          IO Block: 4096   directory
Device: fe04h/65028d    Inode: 509269      Links: 2
Access: (0750/drwxr-x---)  Uid: ( 1000/stribika)   Gid: (  100/   users)
Access: 2011-02-22 08:47:57.465036072 +0100
Modify: 2011-02-22 08:47:57.465036072 +0100
Change: 2011-02-22 08:47:57.465036072 +0100
 Birth: -

正如您所看到的,有 2 个指向空目录的链接。当我在其中创建一个新目录时,链接计数增加到 3。此外,还有 2 个指向新目录的链接。总共有 3 个新链接。

这是因为每个目录都有一个指向其自身 (.) 及其父目录 (..) 的链接。

答案2

在最初的 Unix 实现中,为了保持内核中的文件系统代码简单,目录操作程序做了一些额外的工作:特别是为inmkdir /parent/a创建了一个条目,加上一个名为in 的条目(指向其自身)和一个名为in 的条目(指向1)。a/parent.aa..a/parent

很快, 和 朋友的代码mkdir无论如何都转移到了内核中,但是文件系统格式仍然具有显式的...条目,文件系统遍历代码通过名称找到(而不是在每个目录中有两个特殊格式的指针)。

如今,一些(大多数?)文件系统会伪造它:目录实际上在磁盘上没有.条目,它们是由驱动程序生成的。..然而,从用户的角度来看,这是透明的。目录的链接计数仍然是二加上子目录的数量(父目录中的条目、目录自己的.以及每个子目录的..)。特别是,一个空目录的链接计数为 2(即文件系统中有两个条目指向它),但创建它会创建三个条目(第三个条目..指向父目录)。

1 通过引用,而不是通过名称。因此,如果您重命名/parent,则无论它移动到文件系统结构中的哪个位置,a都会..继续指向a其父目录。

相关内容