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)은 자신이 가지고 있는 링크 수(디렉토리의 항목)를 추적하므로 해당 숫자가 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"의 링크 수가 3이 됩니다 "/a/b".

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

일부 파일 시스템은 btrfs전통적인 디렉터리 구조에서 벗어납니다. btrfs디렉토리에 "."자신의 inode 번호와 동일한 항목이 포함되어 있더라도 파일 시스템의 디렉토리에 대한 링크 수 는 항상 1입니다.

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

find . -name '*.c' -print

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

관련 정보