Unixスタイルのシステムでは、(つまり、データのファイルシステムオブジェクトを表すデータ構造に関するファイル)は、「iノード」と呼ばれるものに保存されています。
ファイル名はこのiノードへの単なるリンクであり、「ハードリンク」と呼ばれます。ファイルに付けられた最初の名前とそれ以降のリンクに違いはありません。答えは「はい」です。ハードリンクは通常のファイルであり、実際、通常のファイルはハードリンクです。
このls
コマンドは、ファイルへのハードリンクの数を表示します。
例えば:
seumasmac@comp:~$ echo Hello > /tmp/hello.txt
seumasmac@comp:~$ ls -l /tmp/hello.txt
-rw-rw-r-- 1 seumasmac seumasmac 6 Oct 4 13:05 /tmp/hello.txt
ここで、というファイルを作成しました/tmp/hello.txt
。の1
出力でls -l
は、このファイルへのハードリンクが1つあることが示されています。このハードリンクはファイル名そのもの/tmp/hello.txt
です。
このファイルへの別のハードリンクを作成する場合:
seumasmac@comp:~$ ln /tmp/hello.txt /tmp/helloagain.txt
seumasmac@comp:~$ ls -l /tmp/hello*
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct 4 13:05 /tmp/helloagain.txt
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct 4 13:05 /tmp/hello.txt
両方のファイル名がファイルへの2つのハードリンクがあることを示していることがわかります。これらはどちらも「適切な」ファイル名ではなく、どちらも同等に有効です。これらは両方とも同じiノード(この場合は5374043)を指していることがわかります。
seumasmac@comp:~$ ls -i /tmp/hello*
5374043 /tmp/helloagain.txt 5374043 /tmp/hello.txt
これはディレクトリごとに異なるという一般的な誤解があります。ls
ディレクトリに対して返されるリンクの数はサブディレクトリの数で.
あり、..
これを含むと間違っていると人々は言うと聞きました。または、少なくとも、正しい番号が提供されますが、間違った理由で正しいのです!
ディレクトリを作成して実行すると、ls -ld
次の結果が得られます。
seumasmac@comp:~$ mkdir /tmp/testdir
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 2 seumasmac seumasmac 4096 Oct 4 13:20 /tmp/testdir
これは、このディレクトリへの2つのハードリンクがあることを示しています。これらは:
/tmp/testdir
/tmp/testdir/.
このディレクトリへのリンクで/tmp/testdir/..
はなく、へのリンクであることに注意してください/tmp
。そして、これは「サブディレクトリの数」の問題がなぜ機能するかを示しています。新しいサブディレクトリを作成するとき:
seumasmac@comp:~$ mkdir /tmp/testdir/dir2
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 3 seumasmac seumasmac 4096 Oct 4 13:24 /tmp/testdir
/tmp/testdir
ディレクトリへの3つのハードリンクがあることがわかります。これらは:
/tmp/testdir
/tmp/testdir/.
/tmp/testdir/dir2/..
そのため、新しいサブディレクトリには、..
エントリが含まれているため、リンクカウントが1つずつ増加します。