ls -l 명령 출력에서 ​​파일 권한과 소유자 사이의 숫자는 얼마입니까? 확인 –help했지만

ls -l명령 출력은 다음과 같은 결과를 나타냅니다.

파일 권한과 소유자 사이의 숫자 필드는 무엇입니까? 즉 , 1, 1, 1 및 2는 무엇입니까? 확인 --help했지만 설명하지 않습니다.

[편집] 나는 그것이 디렉토리의 파일 수라고 생각했지만 그렇지 않습니다. 이미지를 참조하십시오. “tempFolder”는 3 개의 파일을 가지고 있지만 여전히 “2”를 표시합니다



답변

참고 : @StephaneChazelas 주석 이후 편집

ls -l권한 블록 뒤 의 첫 번째 출력 수는 하드 링크 수입니다 .

stat“링크” 의 명령이 반환 한 값과 동일한 값 입니다.

이 숫자는 파일을 참조 할 때 파일의 하드 링크 수 또는 디렉토리를 참조 할 때 포함 된 디렉토리 항목 수입니다.

파일은 일반적으로 하나의 하드 링크 수를 가지고 있지만 하드 링크가로 만든 경우이 변경 ln명령. 데비안 레퍼런스 매뉴얼을 참조 하십시오 .

예제에서 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 / ( 로의 링크 ..)가 카운트에 추가됩니다.


답변

유닉스에서 일반적으로 파일은 파일 테이블의 일부 항목입니다. 일반 파일, 장치, 심볼릭 링크, 문, 파이프, 소켓, 디렉토리 등 다양한 종류의 파일이 있습니다.

inode 번호 (의 출력에서 ​​볼 수 있음 ls -i)는 해당 테이블의 색인입니다.

이제는 inode가 아닌 path로 파일에 액세스합니다 . 경로 의 체인 디렉토리 항목. 우리는 폴더가 아니라 디렉토리에 대해 이야기하고 있습니다. 그것이 디렉토리이기 때문에 (전화 디렉토리를 생각하십시오).

디렉토리는 여러 종류의 inode에 이름을 부여하는 특별한 종류의 파일입니다. 디렉토리 엔트리는 이름에서 inode 로의 매핑입니다.

주어진 파일 (아이 노드)은 하나의 디렉토리에 둘 이상의 이름을 가질 수 있으며 (전화 번호에 둘 이상의 이름이있을 수있는 것처럼) 하나 이상의 디렉토리에 이름 (항목)을 가질 수도 있습니다. 이들은라고 링크 이라고도 하드 링크를 과 구별하기 위해 소프트 링크 (경로에 대한 포인터 파일의 특별한 타입).

파일 (inode)은 링크의 수 (모든 디렉토리의 항목)를 추적하여 번호가 0에 도달 할 때 (참조 된 마지막 디렉토리에서 링크가 해제 될 때) 할당이 해제됩니다.

ls -l출력에 표시되는 숫자 (링크 수)입니다 .

비 디렉토리 파일이 처음 생성 될 때합니다 (함께 open또는 creat(나 bind또는 mknod파일의 일부 유형) 시스템 호출)가 새 파일 (같은 경로로 제공하여 수행됩니다 "/a/b"). 그러면 새로운 파일이 생성되고 inode가 할당되고 루트 디렉토리 의 "a"이름 과 연관된 디렉토리에 새 항목이 추가됩니다 "/". 이것이 첫 번째 링크 이므로 링크 수는 1입니다.

나중에 link()시스템 호출 ( ln명령) 을 사용하여 더 많은 링크를 추가 할 수 있습니다 . unlink()시스템 호출 ( rm명령)을 사용하여 링크를 제거 할 수 있습니다 .

directory 유형의 파일에는 일반적으로 2 이상의 링크가 있습니다.

이제 디렉토리를 만들 때 mkdir()시스템 호출을합니다. 같은 것 mkdir("/a/b"). 그러면 디렉토리 유형의 새 파일이 할당됩니다. 새 디렉토리에서 두 개의 항목을 자동으로 작성합니다.

  • "."( 에 대한 디렉토리 ). 그 자체에 대한 링크입니다. 링크 수는 이제 1입니다.
  • ".."(대한 디렉토리 의의 디렉토리 ). 에 대한 링크 "/a"입니다. 따라서 링크 수 "/a"는 1 씩 증가합니다

그러면 새 디렉토리가 링크되고 "/a"(항목이 추가됨 "/a") 링크 수가 2가됩니다. "/a/b/c"디렉토리가 작성되면의 ".."항목으로 "/a/b/c"인해 링크 수가 "/a/b"3이됩니다.

대부분의 Unices는 문제가있는 루프를 일으킬 수 있으므로 디렉토리에 대한 추가 링크 작성을 제한합니다. link()디렉토리에서 허용하면 일반적으로 수퍼 유저 만 수행 할 수 있습니다.

일부 파일 시스템 btrfs은 기존 디렉토리 구조에서 출발합니다. btrfs파일 시스템의 디렉토리에 대한 링크 수는 디렉토리 "."자체와 동일한 inode 번호를 가진 항목을 포함하더라도 항상 하나 입니다.

링크 수는 전통적으로 2에 하위 디렉토리 수를 더한 것이 사용됩니다. 예를 들어,

find . -name '*.c' -print

.하위 디렉토리를 포함하지 않지만 수백만 개의 파일을 포함하는 경우 의 링크 수를 확인하여 ., find더 하위 디렉터리가 없다는 것을 알 수 있습니다. 따라서 find디렉토리의 내용을 읽고 끝나는 항목을보고하면됩니다 .c( grep '\.c$'몇 메가 바이트 파일 과 같이 큰 문제는 아님). 그렇지 않으면, find모든 단일 파일의 유형을 검사하여 그 안에 내려가는 디렉토리가 있는지 확인해야합니다 (많은 lstat()시스템 호출이 발생 함). 물론 이런 종류의 최적화는 작동하지 않습니다 btrfs(현대 버전의 Linux에서는 파일 유형도 일부 파일 시스템의 디렉토리 항목 (을 포함하여 btrfs)에 저장되고 getdents(2)항목 목록을 검색하는 데 사용되는 시스템 호출에 의해 반환됩니다) 디렉토리에lstat 여전히 필요하지 않습니다).