たとえば、ディレクトリnewDirectoryを作成してから、ls -ldコマンドを実行するとします。ハードリンクの数が2であることがわかります。ハードリンクを最初から正確に2にするにはどうすればよいですか。また、現在のディレクトリのサブディレクトリの数は、ハードリンクの数-2と同じですか?
歴史的に 、最初のUnixファイルシステムはすべてのディレクトリに2つのエントリを作成しました:_.
_はディレクトリ自体を指し、_..
_はその親を指します。これにより、アプリケーションとOSの両方に対して、ファイルシステムをトラバースする簡単な方法が提供されました。
したがって、各ディレクトリのリンク数は2 + nです。nはサブディレクトリの数です。リンクは、その親のディレクトリのエントリ、ディレクトリ自体の_.
_エントリ、および各サブディレクトリの_..
_エントリです。たとえば、これが_/parent
_をルートとするサブツリーのコンテンツであり、すべてのディレクトリであるとします。
_/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3
_
次に、dir
のリンクカウントは5です。_/parent
_のdir
エントリ、_.
_の_/parent/dir
_エントリ、および3つの_..
/parent/dir/sub1
_、_/parent/dir/sub2
_および_/parent/dir/sub3
_のそれぞれの__エントリ。 _/parent/dir/sub1
_にはサブディレクトリがないため、リンク数は2です(_sub1
_の_/parent/dir
_エントリと_.
_の_/parent/dir/sub1
_エントリ)。
「適切な」親を持たないルートディレクトリの特殊なケースの量を最小限に抑えるために、ルートディレクトリにはそれ自体を指す_..
_エントリが含まれています。この方法でも、リンク数は2にサブディレクトリの数を加えたものになります。2は_/.
_と_/..
_です。
後のファイルシステムでは、メモリ内の親ディレクトリを追跡する傾向があり、通常、実際のエントリとして存在する_.
_および_..
_は必要ありません。典型的な最近のUNIXシステムは、_.
_および_..
_をファイルシステムタイプに依存しないファイルシステムコードの一部として特別な値として扱います。一部のファイルシステムには、_.
_および_..
_エントリがまだ含まれているか、ディスクに何も表示されていなくてもふりをします。
ほとんどのファイルシステムは、_.
_および_..
_エントリが存在するかどうかに関係なく、ディレクトリのリンク数2 + nを報告しますが、例外があります。たとえば、btrfsはこれを行いません。
1つはディレクトリ自体用で、もう1つは.
用です。
また、現在のディレクトリのサブディレクトリの数は、ハードリンクの数-2と同じですか?
各サブディレクトリが..
ハードリンクを作成するので、それは理にかなっています。それ以上に、ディレクトリへのハードリンクを作成することはできません。1 しかし、私はこれを深刻なもの、特に特に信頼しません。サブディレクトリを数えて実数を取得するのは簡単だからです。
ls
の出力を見て、サブがいくつあるかを考えているだけなら、きちんとしたアイデアが得られます。
1 または、少なくとも、ln
ではできません。私はプログラムで試したことがなく、man 2 link
があいまいです-適用される可能性のあるカップルがいくつかありますが、ディレクトリへのリンクに明らかなエラーはありません(EMLINK
、EPERM
) 。したがって、ディレクトリへの唯一の可能なハードリンクは.
と..
であるという標準がどこかにない限り、ここでも、そのハードリンク数は偶然の手がかりとしてのみ扱います。