私の考え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/a
inの項目とin(自分を指す)の項目とin(1)を指します。a
/parent
.
a
a
..
a
/parent
すぐに友達のコードがmkdir
カーネルに移動されましたが、ファイルシステム形式にはまだ明示的なエントリと.
ファイル..
システム巡回コードが名前で見つかりました(各ディレクトリに特別にフォーマットされた2つのポインタがある代わりに)。
最近、一部(ほとんど?)ファイルシステムはこれを偽造しています。ディレクトリには実際にディスクにエントリがなく、.
ドライバによって作成されます。..
しかし、ユーザーの観点から見ると、これは透明です。ディレクトリ内のリンクの数は、依然として2にサブディレクトリの数(親ディレクトリのエントリ、ディレクトリ自体、および.
各サブディレクトリのエントリ..
)を加えた値です。特に、空のディレクトリのリンク数は2です(つまり、ファイルシステムにそのディレクトリを指す2つのエントリがあります)。ただし、これを作成すると3つの項目が作成されます(3番目の項目は..
親ディレクトリを指します)。
1
名前ではなく参照として。したがって、名前を変更すると、/parent
ファイルシステム構造内で移動した場所に関係なく、a
親ディレクトリを
..
引き続き続けます。a