`ls`はどのようにハードリンクを見つけるのですか?

`ls`はどのようにハードリンクを見つけるのですか?

設定

私の問題に対して、次のコマンドシーケンスが設定されました。

root@cd330f76096d:/# cd
root@cd330f76096d:~# ls              
root@cd330f76096d:~# mkdir -p my_dir/my_subdir
root@cd330f76096d:~# ls -hAil
total 12K
6175969 -rw-r--r-- 1 root root 3.1K Oct 15  2021 .bashrc
6175970 -rw-r--r-- 1 root root  161 Jul  9  2019 .profile
7382820 drwxr-xr-x 3 root root 4.0K Sep  6 19:34 my_dir

コンテキスト

my_dir出力によると、3つのハードリンクがあります。おそらく彼らは次のようになります:

  • ./my_dir
  • my_dir/.
  • my_dir/my_subdir/..

しかし。 。 。

root@cd330f76096d:~# find . -xdev -inum 7382820
./my_dir

それはすべてです。 1行だけです。

質問

私が見逃しているものとは何ですか?ls -lこれはどのように機能しますか?

私はそれ以上のファイルが見つからない理由は、そのファイルが参照されたためであるとfind半分予想しました...この場合、一体どのようにls -l処理すべきか尋ねました。ソースコード

プリセット

上記の例はドッカーコンテナで作成され、便宜のために以下に共有されています。

$ docker pull ubuntu:jammy
jammy: Pulling from library/ubuntu
Digest: sha256:aabed3296a3d45cede1dc866a24476c4d7e093aa806263c27ddaadbdce3c1054
Status: Downloaded newer image for ubuntu:jammy
docker.io/library/ubuntu:jammy
$ docker run -it ubuntu:jammy bash

答え1

見つかったパス名find(つまり、コマンドラインで指定された検索パス以外のパス)には、またはコンポーネントを.含める..ことができないため、コマンドはこれらのパスを表示しません。

なぜ?なぜならPOSIX規格は次のように述べています。(私のハイライト):

各パスオペランドは、すべての末尾の文字を含めて提供されたときにそのまま評価されます<slash><slash>階層で見つかった他のファイルへのすべてのパス名は、現在のパスオペランドa(現在のパスオペランドが1で終わらない場合)とパスオペランドに基づくファイル名の関連付けで構成されています。関連セクションには、点または点 - 点コンポーネントを含めないでください。、末尾の文字がなく、パス名コンポーネント間に<slash>単一の文字しかありません。<slash>

(上記の「現在のパスオペランド」はコマンドラインの検索パスの1つです。)

このlsコマンドは、ディレクトリ内のリンクの数を計算できます。stat()呼び出され、次を返します。statハードリンク数を含む構造です。厳密に言えば分からないどこしかし、他のハードリンクが見つかりました。

関連情報