$ ln fun fun-hard
$ ln fun dir1/fun-hard
$ ln fun dir2/fun-hard
$ ls -1
total 16
drwxrwxr-x 2 me 4096 2018-01-14 16:17 dir1
drwxrwxr-x 2 me 4096 2018-01-14 16:17 dir2
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun-hard
したがって、ファイルfunにはfunの4つのインスタンスがあり、fun-hardリストの2番目のフィールドには両方とも4が含まれます。これは、現在のファイルに存在するハードリンクの数です。
drwxrwxr-x 2 me 4096 2018-01-14 16:17 dir1
drwxrwxr-x 2 me 4096 2018-01-14 16:17 dir2
dir1とdir2に2つのファイルfun-hardインスタンスがあるのはなぜですか?単一のハードリンクがありませんか?楽しい - 難しい?
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun-hard
この4つの面白くて難しい例を詳しく説明できますか?なぜ再発するのですか?
次の場合、dir1とdir2に2つのハードリンクがあります。
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun
-rw-r—-r—- 4 me 1650 2018-01-10 16:33 fun-hard
...4つのハードリンクインスタンスがありますが、なぜdir1とdir2も4つのインスタンスではないのですか?
答え1
最大ディレクトリには少なくとも2つのハードリンクがあります。通常3つ以上です。次の2つのコマンドを実行すると、3つのハードリンクがあり、foo
もちろんすべてが同じinodeを持っていることがわかります(同じディレクトリへのリンクなので)。
$ mkdir -p foo/bar
$ ls -ldi foo foo/. foo/bar/..
ディレクトリは通常少なくとも次のハードリンク:
- 自体(例
foo
:) - 独自のリンク(例
foo/.
:) foo/bar/..
たとえば、親ディレクトリである各子ディレクトリ(存在する場合)から自分へのリンクです。
ディレクトリ自体へのハードリンクはその内容から完全に独立しており、各ディレクトリ内の各ファイルのハードリンクの数とは完全に別々にカウントされます。
答え2
ls
inode番号とディレクトリツリーを表示するためのより多くのオプションを使用すると、視覚化が容易になります。
$ ls -l --inode --recursive
.:
total 16
6299664 drwxrwxr-x 2 paul paul 4096 Jan 24 10:42 dir1
6299832 drwxrwxr-x 2 paul paul 4096 Jan 24 10:42 dir2
6299812 -rw-rw-r-- 4 paul paul 1970 Jan 24 10:41 fun
6299812 -rw-rw-r-- 4 paul paul 1970 Jan 24 10:41 fun-hard
./dir1:
total 4
6299812 -rw-rw-r-- 4 paul paul 1970 Jan 24 10:41 fun-hard
./dir2:
total 4
6299812 -rw-rw-r-- 4 paul paul 1970 Jan 24 10:41 fun-hard
$
表示されている4つの項目は6299812
異なるディレクトリ項目で、すべて同じinodeとそのデータブロックを参照します。 1つの修正時間と他の内容の修正時間を変更すると、4つの内容が全て変更される。これらのコンテンツのコピーは1つだけです。特に、どちらが「オリジナル」なのかという概念はありません。みんなはい。
inodeはハードリンクの数を保持するため、ファイルマネージャはリンク数が0に達した時点を知ることができ、この時点でデータにアクセスできなくなり、空き領域に戻すことができます。ただし、インデックスノードはこれらのリンクのソースを記録しません。一方、ディレクトリには直系の親エントリへのリンクがあります。