コマンドの出力はls -l
次の結果になります。
ファイルの権限と所有者の間の数字フィールドは何ですか?つまり、それらは何ですか?1、1、1、そして2? 確認しました--help
が、説明がありませんでした。
[編集] ディレクトリ内のファイル数だと思っていましたが、違いました。画像を参照してください。「tempFolder」には 3 つのファイルがありますが、それでも「2」と表示されます。
答え1
注: @StephaneChazelas のコメント後に編集
最初の数字はls -l
許可ブロックの後の出力ハードリンクの数。
stat
これは、「リンク」のコマンドによって返される値と同じ値です。
この数値は、ファイルを参照する場合はファイルのハードリンク数、ディレクトリを参照する場合は含まれるディレクトリ エントリの数です。
あファイル通常、ハードリンク数は1ですが、ハードリンクが作成される場合は変わります。ln
。Debianリファレンスマニュアル。
この例では、tempFile2 にハード リンクを追加すると、リンク数が増加します。
ln -l
ln tempFile2 tempHardLink
ln -l
両方一時ファイル2そして一時ハードリンクリンク数は 2 になります。
同じ操作をシンボリックリンク(ln -s tempFile2 tempSymLink
)で実行しても、カウント値は増加しません。
あディレクトリ'.'
(自分自身へのリンク) と親ディレクトリ内のエントリの最小カウントは 2 になります。
あなたの例では、リンク数を増やしたい場合一時フォルダー新しいディレクトリを作成すると、番号が増加します。
ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder
リンク先別のフォルダ/に一時フォルダー/( ..
) がカウントに追加されます。
答え2
Unix では、通常、ファイルはファイル テーブル内のエントリです。ファイルには、通常のファイル、デバイス、シンボリック リンク、ドア、パイプ、ソケット、ディレクトリなど、さまざまな種類があります。
inode 番号 ( の出力で確認できますls -i
) はそのテーブル内のインデックスです。
今では、ファイルにアクセスするにはiノードしかし、パス.あパスは、ディレクトリエントリー。ここで話題にしているのはフォルダしかしディレクトリここに。ディレクトリとはそういうものだからです (電話帳を思い浮かべてください)。
ディレクトリは、複数の inode に名前を付ける特殊な種類のファイルです。ディレクトリ エントリは、名前から inode へのマッピングです。
特定のファイル(inode)は、1つのディレクトリに複数の名前を持つことができます(電話番号に複数の名前があるのと同じように)。また、複数のディレクトリに名前(エントリ)を持つこともできます。これらはリンク、 としても知られているハードリンク区別するソフトリンク(俗語でシンボリックリンク、これはパスへのポインタである特殊なタイプのファイルです。
ファイル (inode) は、そのファイルに含まれるリンク (任意のディレクトリ内のエントリ) の数を追跡します。そのため、その数が 0 に達すると (参照されていた最後のディレクトリからリンクが解除されると)、割り当てが解除されます。
それが出力に表示される数値(リンクの数)ですls -l
。
ディレクトリ以外のファイルが初めて作成されるとき(open
またはcreat
(またはbind
一部mknod
のファイルタイプではまたは)システムコールを使用)、新しいファイルへのパス( など)を提供することで実行されます。その後、新しいファイルとinodeが割り当てられ、ルートディレクトリの名前"/a/b"
に関連付けられたディレクトリに新しいエントリが追加されます。これが初期ファイルです。"a"
"/"
リンクしたがってリンク数は 1 です。
link()
システム コール (コマンド)を使用して、後からさらにリンクを追加できます。また、システム コール (コマンド)ln
を使用してリンクを削除することもできます。unlink()
rm
ファイルの種類のディレクトリ通常、リンクの数は 2 以上です。
さて、ディレクトリを作成すると、mkdir()
システム コールが呼び出されます。 のようなものmkdir("/a/b")
で、次にディレクトリ タイプの新しいファイルが割り当てられます。その新しいディレクトリには、次の 2 つのエントリが自動的に作成されます。
"."
(ドットのためにディレクトリ) はそれ自体へのリンクです。したがって、リンク数は 1 になります。".."
(のためにディレクトリのディレクトリ)。これは へのリンクです"/a"
。したがって のリンク数は"/a"
1つ増えます。
次に、その新しいディレクトリが にリンクされる"/a"
( にエントリが追加される"/a"
) ため、そのリンク数は 2 になります。 ディレクトリが作成されると、のエントリ"/a/b/c"
により、 のリンク数は3 になります。".."
"/a/b/c"
"/a/b"
ほとんどの Unix では、問題のあるループが発生する可能性があるため、ディレクトリへのさらなるリンクの作成が制限されています。ディレクトリへのリンクの作成が許可されている場合でもlink()
、通常はスーパーユーザーのみが実行できます。
一部のファイルシステムは、従来のディレクトリ構造から逸脱しています。ファイルシステム内のディレクトリには、そのディレクトリ自体と同じ inode 番号を持つエントリが含まれているにもかかわらず、btrfs
ディレクトリのリンク数は常に 1 であることがわかります。btrfs
"."
リンク数は伝統的に 2 にサブディレクトリの数を加えた数であるという事実は役に立ちます。たとえば、次のようになります。
find . -name '*.c' -print
.
にサブディレクトリが含まれないが、数百万のファイルが含まれる場合、 のリンク数をチェックすることで.
、find
サブディレクトリがないことがわかります。 したがって、find
はディレクトリのコンテンツを読み取って、 で終わるエントリを報告すればよいだけです.c
(grep '\.c$'
数メガバイトのファイルの など、大した問題ではありません)。 そうでない場合、 はfind
すべてのファイルのタイプをチェックして、そこに下るディレクトリがあるかどうかを確認する必要があります (結果として、lstat()
システム コールの数だけ発生します)。 もちろん、この種の最適化は では機能しませんbtrfs
(ただし、Linux の最新バージョンでは、一部のファイル システム ( を含む) のディレクトリ エントリにファイルのタイプも保存されbtrfs
、getdents(2)
ディレクトリ内のエントリのリストを取得するために使用されるシステム コールによって返されるため、 はlstat
まだ必要ありません)。