回答:
注:@StephaneChazelasコメントの後に編集
ls -l
許可ブロックの後の出力の最初の番号はハードリンクの数です。。
stat
「リンク」のコマンドによって返される値と同じ値です。
この数値は、ファイルを参照する場合のファイルのハードリンクカウント、またはディレクトリを参照する場合の含まれるディレクトリエントリの数です。
ファイルには、通常、1のハードリンクの数を持っていますが、ハードリンクがで作られている場合、これは変更ln
コマンド。Debianリファレンスマニュアルを参照してください。
この例では、tempFile2のハードリンクを追加すると、リンクカウントが増加します。
ln -l
ln tempFile2 tempHardLink
ln -l
tempFile2とtempHardLinkの両方のリンクカウントは2です。
シンボリックリンクで同じエクササイズを行う場合(ln -s tempFile2 tempSymLink
)場合、カウント値は増加しません。
ディレクトリには、 2の最小数を持っています'.'
(それ自体へのリンク)とその親のディレクトリ内のエントリのために。
この例では、tempFolderのリンク数を増やしたい場合、新しいディレクトリを作成すると、番号が上がります。
ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder
リンクanotherFolder /へTempFolderのは/(である..
)のカウントに追加されます。
.
に2つ、それ自体のエントリに加えて..
、各サブディレクトリのエントリに1つがあります。
ls
2文字を費やしてより多くの情報を与えることができ、stat(1)
コマンドもノーもシンボリックリンクもfind(1)
なかっfsck
た可能性があります今日よりも便利です。作家が長い歴史を持つシェルスクリプトを壊さずに変更することはできません/dev/null
。少なくとも1979年以来、そのようになっています。
Unixでは、通常、ファイルはファイルのテーブル内のエントリです。さまざまな種類のファイルがあります:通常のファイル、デバイス、symbolikリンク、ドア、パイプ、ソケット、ディレクトリ...
iノード番号(の出力で確認できますls -i
)は、そのテーブルのインデックスです。
現在、inodeではなくpathでファイルにアクセスしています。パスはの鎖であるディレクトリエントリ。ここで、フォルダではなくディレクトリについて説明していることに気付くでしょう。それはディレクトリであるためです(電話帳を考えてください)。
ディレクトリは、多くのiノードに名前を付ける特別な種類のファイルです。ディレクトリエントリは、名前からiノードへのマッピングです。
特定のファイル(iノード)は、1つのディレクトリに複数の名前を持つことができ(電話番号に複数の名前がある場合と同様)、複数のディレクトリに名前(エントリ)を持つこともできます。これらはソフトリンク(パスへのポインタである特別な種類のファイル)と区別するために、ハードリンクとも呼ばれるリンクと呼ばれます。
ファイル(inode)は、(ディレクトリ内のエントリの)リンクの数を追跡します。そのため、数が0に達すると(参照された最後のディレクトリからリンク解除されると)、割り当てが解除されます。
それは、ls -l
出力に表示されるその数(リンクの数)です。
非ディレクトリファイルが最初に作成されたとき(にopen
かcreat
(またはbind
またはmknod
ファイルのいくつかのタイプ)システムコールのために)、それは新しいファイル(のようなパスを提供することで行われます"/a/b"
)。次に、新しいファイルとiノードが割り当てられ"a"
、"/"
ルートディレクトリ内の名前に関連付けられたディレクトリに新しいエントリが追加されます。これが最初のリンクなので、リンク数は1です。
link()
システムコール(ln
コマンド)を使用して、後からリンクを追加できます。また、unlink()
システムコール(rm
コマンド)でリンクを削除できます。
タイプディレクトリのファイルには、通常、2以上のリンクがあります。
これで、ディレクトリを作成するときに、mkdir()
システムコールを呼び出しています。のようなものmkdir("/a/b")
。次に、タイプがディレクトリの新しいファイルを割り当てます。その新しいディレクトリに、次の2つのエントリが自動的に作成されます。
"."
(ドットのためのディレクトリ)。これはそれ自体へのリンクです。したがって、リンク数は1になりました。".."
(ディレクトリのディレクトリ用)。へのリンク"/a"
です。したがって、のリンクカウントは"/a"
1ずつ増加します次に、その新しいディレクトリがリンクされます"/a"
(エントリが追加さ"/a"
れます)。そのため、そのリンクカウントは2になります。"/a/b/c"
ディレクトリが作成されると、の".."
エントリのため"/a/b/c"
、リンクカウントは"/a/b"
3になります。
ほとんどのUnicesは、問題のあるループを引き起こす可能性があるため、ディレクトリへのさらなるリンクの作成を制限しています。link()
ディレクトリでa を許可する場合、通常はスーパーユーザーのみが許可します。
一部のファイルシステムはbtrfs
、その従来のディレクトリ構造から逸脱しています。btrfs
ファイルシステム内のディレクトリのリンクカウントは、それらのディレクトリ"."
に同じiノード番号のエントリが含まれていても、常に1であることに気付くでしょう。
リンクカウントが従来2にサブディレクトリの数を加えたものであるという事実は、その用途があります。たとえば、次の場所:
find . -name '*.c' -print
もしは、.
サブディレクトリが含まれているが、数百万のファイルが含まれていません。リンク数をチェックして.
、find
何のサブディレクトリが存在しないことを知ることができます。そのfind
ため、ディレクトリの内容を読み取り、終了するエントリを報告するだけです.c
(grep '\.c$'
数メガバイトのファイルなど、大したことはありません)。それ以外の場合は、find
すべての単一ファイルのタイプをチェックして、そこに下るディレクトリがあるかどうかを確認する必要があります(結果としてlstat()
システムコールが多くなります)。もちろん、この種の最適化は動作しませんbtrfs
(Linuxの最新バージョンでは、ファイルの種類は一部のファイルシステム(を含むbtrfs
)のディレクトリエントリにも保存され、によって返される必要はありません)。getdents(2)
のリストを取得するために使用されるシステムコールますディレクトリにあるので、lstat
-
許可の後、その場所に数字の代わりに番号を付けるとはどういう意味ls -l
ですか?