디렉토리의 mtime에 관해서는 Stéphane Chazelas의 답변입니다. https://unix.stackexchange.com/a/187231/674
다른 파일과 마찬가지로 디렉터리(디렉터리를 폴더가 아니라 디렉터리(전화번호부와 같은 이름/번호 매핑 목록)라고 부르는 방식에 유의)의 수정 시간은 내용이 수정될 때마다 업데이트됩니다.
즉, 파일이 추가(링크), 삭제(링크 해제)되거나 이름이 변경된 경우입니다.
이것은 서브파일과 관련된 디렉토리의 내용이 서브파일의 파일 이름과 서브파일에 대한 하드 링크 수뿐이라는 것을 의미합니까?
그렇지 않은 경우 상위 디렉터리의 내용에 하위 파일에 대한 다른 정보가 있습니까?
즉, 하위 파일의 내용을 변경하면 상위 디렉토리의 mtime도 변경됩니까?
디렉토리의 atime은 언제 변경됩니까?
ls -l
, ctimels -ld
모두cd
디렉토리의 ctime을 변경 하지 않은 것으로 나타났습니다 . 나는 명령이 디렉토리의 내용을 표시하므로 디렉토리의 내용을 읽는다고 생각했습니다.디렉토리의 ctime은 언제 변경됩니까?
감사해요.
답변1
디렉터리를 다음과 같은 텍스트 파일로 처리합니다.
123:foo.txt
234:bar.txt
123:other-name-for-foo.txt
그게 전부입니다(적어도 기존 Unix 파일 시스템에서는).
foo.txt
하나도 아니야어린이배타적 관계가 아니기 때문에 디렉터리 이름입니다. inode 번호가 123인 파일만 이 디렉토리의 두 항목( with foo.txt
및 ) 에서 참조됩니다 other-name-for-foo.txt
.
이 두 개의 디렉토리 항목은 두 개의 디렉토리 항목이라고도 합니다.딱딱한동일한 파일에 연결합니다.
$ touch foo.txt bar.txt
$ mkdir other-dir
$ ln foo.txt other-name-for-foo.txt
$ ln foo.txt other-dir/whatever
$ ls -i . other-dir
.:
58892735 bar.txt 58958143 other-dir/
58879562 foo.txt 58879562 other-name-for-foo.txt
other-dir:
58879562 whatever
.
other-dir
두 가지 유형의 파일 입니다목차, 각각에는 여러 디렉터리 항목이 포함되어 있습니다. ls
이름이 시작하지 않고 inode 번호를 포함하는 디렉토리 항목을 나열 .
합니다 -i
.
-a
이는 (점 파일 포함) 및 -i
( )를 사용하여 ls -ai
내용을 다소 덤프합니다.텍스트 파일위에서 이미 언급했습니다.
위의 inode 58879562 파일이 한 번 other-dir
과 두 번 연결되어 있음을 알 수 있습니다 .
. 58879562 파일의 링크 개수는 이제 3개이지만 그 역시 .
신경 쓰지 않습니다 other-dir
. 이 정보는 파일의 inode에 저장되며 파일이 디렉터리에 연결된 횟수를 추적하기 위해 시스템에서만 사용됩니다. 숫자가 0으로 떨어지면 파일이 차지하는 디스크 공간을 회수할 수 있습니다.
inode 번호 및 이름 외에도 디렉토리에는 파일의 파일 유형도 포함됩니다(일반 /fifo/directory/symlink/device..., 그러나 모든 파일 시스템에 해당되는 것은 아님). 이 정보는 (인덱스 노드에 저장되어 있기 때문에) 다른 방법으로 검색할 수 있으므로 필요하지 않습니다. 이는 주로 최적화 목적으로 그리고 가능하기 때문에 수행됩니다. 이는 다른 메타데이터와 달리 파일 유형을 변경할 수 없기 때문에 가능합니다. 따라서 디렉터리에 저장된 정보는 현실과 동기화되지 않습니다.
또한 파일을 삭제하기 위한 시스템 호출이 가 아니라는 점도 알 수 remove("/foo/bar")
있습니다 unlink("/foo/bar")
. 그 이유는 디렉토리 bar
에서 항목을 삭제하는 것뿐이기 때문입니다./foo
풀리다 bar
에서 /foo
. 파일은 여전히 다른 이름을 가진 다른(또는 동일한) 디렉터리에 연결되어 있을 수 있습니다. 링크 수가 0에 도달한 경우(더 이상 어떤 디렉터리에도 연결되지 않은 경우)에만 삭제됩니다.
ls
작업을 수행해 도 디렉토리의 액세스 시간이 업데이트되지 않는 이유 는 아마도 파일 시스템이 noatime
또는 relatime
옵션으로 마운트되었기 때문일 것입니다.
파일(디렉토리 등)을 읽을 때마다 액세스 시간을 업데이트하는 것은 비용이 많이 들기 때문에 이제 많은 시스템이 이 관행을 포기합니다.
시스템(사용자가 아닌 경우)은 항상 디렉터리를 읽습니다.
예를 들어 액세스할 때 /foo/bar
시스템은 내용을 읽어서 /
찾은 foo
다음 /foo
다시 검색 해야 합니다 bar
(대부분의 경우 이 정보는 캐시되어 있음). 그러나 이러한 경우 atime은 업데이트되지 않습니다(고맙게도). 사용자 공간 프로세스가분명히다음과 같은 디렉토리의 내용을 읽으십시오 ls
.
디렉터리의 디렉터리가 업데이트 되는 경우 ctime
일반 파일과 동일합니다. 콘텐츠가 수정되거나(항목 추가, 제거 또는 이름 변경) 메타데이터( atime
읽을 때 제외)(예: chmod
/ chown
, ACL 수정)가 변경됩니다. ..).