コマンドの出力は、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
)はテーブルへのインデックスです。
これで、次のファイルにアクセスできなくなります。インデックスノードしかしそれを通して道。 ㅏ道チェーンです目次記入。私たちが話しているのではないことがわかります。フォルダしかし、目次ここで。ディレクトリだからです(電話ディレクトリを考えてみてください)。
ディレクトリは多くのinodeの名前を指定する特別なファイルです。ディレクトリエントリは、名前からインデックスノードへのマッピングです。
指定されたファイル(inode)は、ディレクトリに複数の名前を持つことができ、(電話番号が複数の名前を持つことができるように)、複数のディレクトリに名前(項目)を持つことができます。それらは呼び出されますリンク、また〜として知られるハードリンク区別するためにソフトリンク(スラングシンボリックリンク、これはパスへのポインタである特別な種類のファイルです。
ファイル(inode)は自分が持っているリンクの数(ディレクトリ内のエントリ)を追跡するため、その数がゼロに達すると(参照した最後のディレクトリでリンクが解放されたとき)、解放されます。
これは出力に表示される番号(リンク数)ですls -l
。
ディレクトリ以外のファイルが最初に作成された場合(open
またはcreat
(bind
またはmknod
一部のファイルタイプの場合)、システムコールを使用して)、新しいファイルへのパス(たとえば)を指定することによって実行されます"/a/b"
。その後、新しいファイルとinodeが割り当てられ、ルートディレクトリ"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"
リンク数が3になります"/a/b"
。
ほとんどのUniceは問題のあるループを引き起こす可能性があるため、ディレクトリへの追加リンクの生成を制限します。link()
ディレクトリに対する操作を許可する場合は、通常、スーパーユーザーだけがそのタスクを実行できます。
一部のファイルシステムは、btrfs
従来のディレクトリ構造から外れています。btrfs
ディレクトリに"."
自分のinode番号と同じエントリが含まれていても、ファイルシステム内のディレクトリへのリンク数は常に1です。
リンクの数は、伝統的に2にサブディレクトリの数を加えた値であるという事実が便利です。たとえば、
find . -name '*.c' -print
.
サブディレクトリはありませんが、何百万ものファイルが含まれている場合です。リンク数を見ると、サブディレクトリがないことがわかります.
。find
したがって、find
実行される作業は、ディレクトリの内容を読み、次に終わる項目を報告することです.c
(例:grep '\.c$'
数メガバイトのファイル、特に問題ありません)。それ以外の場合は、find
各ファイルの種類を調べて、入力するディレクトリがあるかどうかを確認する必要があります(結果的にできるだけ多くのlstat()
システムコールが発生します)。もちろん、この最適化は機能しません(最新バージョンのLinuxでは、ファイル形式がまだ必要ないことを含む一部のファイルシステムのディレクトリエントリbtrfs
にも保存されます)。btrfs
getdents(2)
lstat