`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출력에 따르면 세 개의 하드 링크가 있습니다. 아마도 그들은 다음과 같습니다:

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

하지만. . .

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

그게 다야. 줄이 하나뿐입니다.

질문

내가 놓치고 있는 것이 무엇이며/또는 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>

(위에서 언급한 "현재 경로 피연산자"는 명령줄의 검색 경로 중 하나입니다.)

ls명령은 디렉토리의 링크 수를 계산할 수 있습니다.stat()호출되어 다음을 반환합니다.stat하드 링크 수를 포함하는 구조입니다. 엄밀히 말하면 모르겠다어디그러나 다른 하드 링크가 발견되었습니다.

관련 정보