ls -lコマンド出力のファイル許可と所有者の間の数は?


35

ls -lコマンドの出力では、次の結果が得られます。

enter image description here

ファイル許可と所有者の間の数字フィールドは何ですか?すなわち、それらの1、1、1 、および2は何ですか?私はチェックしました--helpが、それはそれを説明しません。

[編集]ディレクトリ内のファイルの数だと思ったが、そうではなかった。画像をご覧ください。「tempFolder」には3つのファイルがありますが、「2」が表示されます

回答:


33

注:@StephaneChazelasコメントの後に編集

ls -l許可ブロックの後の出力の最初の番号はハードリンクの数です。

stat「リンク」のコマンドによって返される値と同じ値です。

この数値は、ファイルを参照する場合のファイルのハードリンクカウント、またはディレクトリを参照する場合の含まれるディレクトリエントリの数です。

ファイルには、通常、1のハードリンクの数を持っていますが、ハードリンクがで作られている場合、これは変更lnコマンド。Debianリファレンスマニュアルを参照してください。

この例では、tempFile2のハードリンクを追加すると、リンクカウントが増加します。

ln -l
ln tempFile2 tempHardLink
ln -l

tempFile2tempHardLinkの両方のリンクカウントは2です。

シンボリックリンクで同じエクササイズを行う場合(ln -s tempFile2 tempSymLink)場合、カウント値は増加しません。

ディレクトリには、 2の最小数を持っています'.'(それ自体へのリンク)とその親のディレクトリ内のエントリのために。

この例では、tempFolderのリンク数を増やしたい場合、新しいディレクトリを作成すると、番号が上がります。

ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder

リンクanotherFolder /TempFolderのは/(である..)のカウントに追加されます。



権限と所有権の間に表示されるので、非常に重要な印象を受けますが、使用したことはありません。通常はいつ必要ですか?
エマニュエルベルク

1
それは間違っています。リンク数、期間です。ディレクトリの場合、親ディレクトリのエントリ(ファイルとまったく同じ).に2つ、それ自体のエントリに加えて..、各サブディレクトリのエントリに1つがあります。
ステファンシャゼル

@StephaneChazelas私が見つけたすべてのドキュメントは、ハードリンク数について説明しています(たとえば、linuxgazette.net/issue35/tag/links.html)。また、AskUbuntu(askubuntu.com/questions/19510/…)で同様の質問がされていることがわかりました。coreutilsのソースコードを確認し、正確な答えがわかるかどうかを確認します。
ダミアン

2
@EmanuelBergは、ファイルシステムが現在よりもはるかに信頼性が低く、開発したファイルシステムで作業しており、ls2文字を費やしてより多くの情報を与えることができ、stat(1)コマンドもノーもシンボリックリンクもfind(1)なかっfsckた可能性があります今日よりも便利です。作家が長い歴史を持つシェルスクリプトを壊さずに変更することはできません/dev/null。少なくとも1979年以来、そのようになっています。
msw

8

Unixでは、通常、ファイルはファイルのテーブル内のエントリです。さまざまな種類のファイルがあります:通常のファイル、デバイス、symbolikリンク、ドア、パイプ、ソケット、ディレクトリ...

iノード番号(の出力で確認できますls -i)は、そのテーブルのインデックスです。

現在、inodeではなくpathでファイルにアクセスしています。パスはの鎖であるディレクトリエントリ。ここで、フォルダではなくディレクトリについて説明していることに気付くでしょう。それはディレクトリであるためです(電話帳を考えてください)。

ディレクトリは、多くのiノードに名前を付ける特別な種類のファイルです。ディレクトリエントリは、名前からiノードへのマッピングです。

特定のファイル(iノード)は、1つのディレクトリに複数の名前を持つことができ(電話番号に複数の名前がある場合と同様)、複数のディレクトリに名前(エントリ)を持つこともできます。これらはソフトリンク(パスへのポインタである特別な種類のファイル)と区別するために、ハードリンクとも呼ばれるリンクと呼ばれます

ファイル(inode)は、(ディレクトリ内のエントリの)リンクの数を追跡します。そのため、数が0に達すると(参照された最後のディレクトリからリンク解除されると)、割り当てが解除されます。

それは、ls -l出力に表示されるその数(リンクの数)です。

非ディレクトリファイルが最初に作成されたとき(にopencreat(または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ため、ディレクトリの内容を読み取り、終了するエントリを報告するだけです.cgrep '\.c$'数メガバイトのファイルなど、大したことはありません)。それ以外の場合は、findすべての単一ファイルのタイプをチェックして、そこに下るディレクトリがあるかどうかを確認する必要があります(結果としてlstat()システムコールが多くなります)。もちろん、この種の最適化は動作しませんbtrfs(Linuxの最新バージョンでは、ファイルの種類は一部のファイルシステム(を含むbtrfs)のディレクトリエントリにも保存され、によって返される必要はありません)。getdents(2)のリストを取得するために使用されるシステムコールますディレクトリにあるので、lstat


+1、すばらしい回答:) lsのソースコードを見ると、statの呼び出し後にリンク番号が更新されていることに気付きました。したがって、statコマンドは、ファイルまたはディレクトリのリンクの値を提供します。
ダミアン

出力の-許可の後、その場所に数字の代わりに番号を付けるとはどういう意味ls -lですか?
シューハム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.