* nixで新しいディレクトリを作成すると、いくつのエントリが生成されますか?

* nixで新しいディレクトリを作成すると、いくつのエントリが生成されますか?

私の考えmkdir ~/aには2~3個程度のようだ。

  • そのディレクトリに1つのエントリ(~/a)があります。
  • それ自体には1つの項目があります(cd a && ls .)。
  • および/または自分自身のための1つの項目を追加(cd a && ls ..

誰かがこれが2か3かを明確にすることはできますか?

答え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の実装では、カーネルのファイルシステムコードを簡単に保つために、ディレクトリマニピュレータはいくつかの追加作業を行いました。特に、mkdir /parent/ainの項目とin(自分を指す)の項目とin(1)を指します。a/parent.aa..a/parent

すぐに友達のコードがmkdirカーネルに移動されましたが、ファイルシステム形式にはまだ明示的なエントリと.ファイル..システム巡回コードが名前で見つかりました(各ディレクトリに特別にフォーマットされた2つのポインタがある代わりに)。

最近、一部(ほとんど?)ファイルシステムはこれを偽造しています。ディレクトリには実際にディスクにエントリがなく、.ドライバによって作成されます。..しかし、ユーザーの観点から見ると、これは透明です。ディレクトリ内のリンクの数は、依然として2にサブディレクトリの数(親ディレクトリのエントリ、ディレクトリ自体、および.各サブディレクトリのエントリ..)を加えた値です。特に、空のディレクトリのリンク数は2です(つまり、ファイルシステムにそのディレクトリを指す2つのエントリがあります)。ただし、これを作成すると3つの項目が作成されます(3番目の項目は..親ディレクトリを指します)。

1 名前ではなく参照として。したがって、名前を変更すると、/parentファイルシステム構造内で移動した場所に関係なく、a親ディレクトリを ..引き続き続けます。a

関連情報