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


35

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

여기에 이미지 설명을 입력하십시오

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

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

답변:


33

참고 : @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 / ( 로의 링크 ..)가 카운트에 추가됩니다.



권한과 소유권 사이에 표시되므로 매우 중요하다는 인상을 받았지만 결코 사용하지는 않았습니다. 일반적으로 필요한시기는 언제입니까?
Emanuel Berg

1
맞습니다. 링크 카운트, 기간입니다. 디렉토리의 경우 상위 디렉토리 (파일과 마찬가지로)에 해당 .항목과 자체 ..하위 항목에 각각 2 개의 하위 디렉토리에 대한 항목이 있습니다 .
Stéphane Chazelas

@StephaneChazelas 내가 찾은 모든 문서는 하드 링크 수에 대해 이야기합니다 (예 : linuxgazette.net/issue35/tag/links.html ). 또한 AskUbuntu ( askubuntu.com/questions/19510/… ) 에서도 비슷한 질문이 있음을 알았습니다 . coreutils 소스 코드를 확인하고 정확한 답을 찾을 수 있는지 확인하겠습니다.
Damien

2
@EmanuelBerg 파일 시스템이 현재보다 훨씬 덜 신뢰할 수 있고 개발 한 파일 시스템에서 작업 ls할 때 2 문자를 사용하고 더 많은 정보를 제공 할 수 있으며 stat(1)명령도 find(1)없었 fsck으며 심볼릭 링크도 훨씬 더 많았 습니다. 오늘보다 유용합니다. 작가가 오래전부터 지나간 쉘 스크립트를 깨지 않고는 변경할 수 없습니다 /dev/null. 그것은 적어도 1979 년 이후로 그렇게되었습니다.
msw

8

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

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 여전히 필요하지 않습니다).


+1, 큰 답변 :) ls 소스 코드를 보면 stat 호출 후 링크 번호가 업데이트 된 것을 알 수있었습니다. 따라서 stat 명령은 파일 또는 디렉토리에 대한 링크 값을 제공합니다.
Damien

출력 -권한 후 자리에 숫자 대신 숫자 가 있다는 것은 무엇을 의미 ls -l합니까?
Shubham
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.