新しいディレクトリに追加する前のハードリンクカウントが2になるのはなぜですか?


38

ディレクトリnewDirectoryを作成してからls -ldコマンドを実行するとします。ハードリンクの数は2です。最初からハードリンク2を作成する正確な理由は何ですか?また、現在のディレクトリ内のサブディレクトリの数は、ハードリンクの数-2に等しくなりますか?


回答:


39

歴史的に、最初のUnixファイルシステムはすべてのディレクトリに2つのエントリを作成.しました。ディレクトリ自体を..指し、その親を指します。これにより、アプリケーションとOS自体の両方について、ファイルシステムを簡単に走査できます。

したがって、各ディレクトリのリンク数は2 + nで、nはサブディレクトリの数です。リンクは、その親のディレクトリの.エントリ、ディレクトリ自体のエントリ、および..各サブディレクトリのエントリです。たとえば、これがをルートとするサブツリーのコンテンツであり/parent、すべてのディレクトリであるとします。

/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3

その後dir5のリンクカウントがありますdirのエントリ/parent.のエントリ/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はこれを行いません。


4
..親をポイントしても、現在のディレクトリのリンク数には影響しません。2のカウントは.、ディレクトリの(元の)名前自体からリストされます。あなたがそれを置く方法が少し曖昧であり、それは以下のように聞こえる...の2つです。..数学がどのように機能するかを説明するためにのみ使用する必要があります2+n:)
th3an0maly

@ th3an0maly親を指すと、親のリンクカウントに影響します。「各サブディレクトリの..エントリ」がどのように曖昧であるかは実際にはわかりません。
ジル 'SO-悪であるのをやめる'

実際、この答え:unix.stackexchange.com/a/101516/160264はまさに私が示唆していたことです。あなたの答えが一番上にあったので、あなたの答えを読んだ後にそれを読んでください。
th3an0maly

@ th3an0malyあなたが何を示唆しているのかまだわかりません。ほのめかすのではなく、はっきりと表現できますか?
ジル 'SO-悪であるのをやめる'

@goldilocksの答えは明らかです。私が言いたいのは、あなたの答えはもっと彼に似ているかもしれないということです。しかし、その後、私はあなたの答えを読んでいたときに彼の答えを読んでいませんでした。最初の行は、元のコメントで述べたとおり.です。「ディレクトリ自体に1つ、その中に1つあります。」それでも不明な場合は、これ以上明確にすることができません。私ができることは、ここにコメントで彼の答えをコピーして貼り付けることだけです。
th3an0maly

13

ディレクトリ自体用とディレクトリ.内用があります。

また、現在のディレクトリ内のサブディレクトリの数は、ハードリンクの数-2に等しくなりますか?

各サブディレクトリは..ハードリンクを作成するため、これは理にかなっています。それを超えると、ディレクトリへのハードリンクを作成できません。1 しかし、私はこれを真剣なもの、特には信じません。サブディレクトリを数えて実際の数を取得するのは簡単だからです。

ただls何人の潜水艦がいるのかのアイデアのために出力を見ているなら、それはあなたにまともなアイデアを与えます。

1または、少なくとも、できませんln。私はプログラムで試みたことがなく、man 2 linkあいまいです。ディレクトリへのリンクに明らかなエラーはありませんが、適用される可能性のあるカップルがあります(EMLINKEPERM)。そのため、ディレクトリへの唯一の可能なハードリンクが.and ..であると言う標準がどこかになければ、そのハードリンクカウントを単なる手がかりとして扱うだけです。


2
ディレクトリへのリンクが許可されているかどうか、およびリンクカウントからサブディレクトリをカウントできるかどうかは、使用しているファイルシステムに依存します。許可するものも許可しないものもあります。
アランク

macOSのTime Machineは実際にはディレクトリを以前のバックアップにハードリンクすることに注意してください。こうすることで、各増分バックアップが完全コピーであるように見せかけ、他の増分に影響を与えることなく任意の増分バックアップを削除できます。また、非常に壊れやすく、通常のシステムコールを使用して遊んでいたので、ファイルシステムを徹底的に使いました。
-w00t
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.