ls -l 명령 출력에서 ​​파일 권한과 소유자 사이의 숫자는 무엇입니까?

ls -l 명령 출력에서 ​​파일 권한과 소유자 사이의 숫자는 무엇입니까?

명령 의 출력은 ls -l다음과 같은 결과를 생성합니다.

여기에 이미지 설명을 입력하세요

파일 권한과 소유자 사이의 숫자 필드는 무엇입니까? 즉, 그게 뭐야?1, 1, 1, 2? 확인해봤는데 --help설명이 안되네요.

[편집] 디렉토리에 있는 파일 수인 줄 알았는데 그렇지 않습니다. 이미지를 참조하세요. "tempFolder"에는 3개의 파일이 있지만 여전히 "2"가 표시됩니다.

답변1

참고: @StephaneChazelas 댓글 이후 편집됨

ls -l권한 블록 이후 출력 의 첫 번째 숫자 는 다음과 같습니다.하드 링크 수.

stat"링크"의 명령 에 의해 반환된 값과 동일한 값입니다 .

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

파일일반적으로 하드 링크 수는 1이지만 명령을 사용하여 하드 링크를 만들면 변경됩니다 ln. 보다데비안 참조 매뉴얼.

귀하의 예에서 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)은 하나의 디렉토리에 둘 이상의 이름을 가질 수 있으며(전화번호에 둘 이상의 이름이 있을 수 있는 것처럼), 둘 이상의 디렉토리에 이름(항목)이 있을 수도 있습니다. 저것들은 불린다연결, 또한 ~으로 알려진하드 링크구별하다소프트 링크(속어 용어심볼릭 링크,이는 경로에 대한 포인터인 특별한 유형의 파일입니다.

파일(inode)은 자신이 가지고 있는 링크 수(디렉토리에 있는 항목)를 추적하여 숫자가 0에 도달하면(참조된 마지막 디렉토리에서 링크가 해제될 때) 할당이 취소됩니다.

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

디렉토리가 아닌 파일이 처음으로 생성될 때( open또는 creat( bind또는 mknod일부 파일 유형의 경우) 시스템 호출을 사용하여) 새 파일에 대한 경로(예: )를 제공하여 수행됩니다 "/a/b". 그러면 새 파일이 생성되고 inode가 할당되며 루트 디렉터리 "a"의 이름 과 연결된 디렉터리에 새 항목이 추가됩니다 "/". 그게 초기야링크따라서 링크 수는 1입니다.

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

다음 유형의 파일이 있다는 것을 알 수 있습니다.예배 규칙서일반적으로 2개 이상의 링크 수를 갖습니다.

이제 디렉터리를 만들 때 mkdir()시스템 호출을 호출하게 됩니다. . mkdir("/a/b")​그런 다음 디렉터리 유형의 새 파일을 할당합니다. 새 디렉터리에 자동으로 두 개의 항목이 생성됩니다.

  • "."(~을 위한예배 규칙서). 그 자체에 대한 링크입니다. 따라서 링크 수는 이제 1입니다.
  • ".."(을 위한예배 규칙서'에스예배 규칙서). 에 대한 링크입니다 "/a". 따라서 링크 수가 "/a"1씩 증가합니다.

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

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

같은 일부 파일 시스템은 btrfs전통적인 디렉터리 구조에서 벗어납니다. 파일 시스템의 디렉토리에 있는 링크 수는 해당 디렉토리 에 자체와 동일한 inode 번호를 가진 항목이 btrfs포함되어 있더라도 항상 1이라는 것을 알 수 있습니다 ."."

링크 수가 전통적으로 2에 하위 디렉터리 수를 더한 값이라는 사실이 유용합니다. 예를 들어:

find . -name '*.c' -print

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

관련 정보