나는 다른 디렉토리 구조에 있는 첫 번째 하드 링크의 많은 하드 링크가 있는 대규모 디렉토리 구조를 가지고 있습니다. 예를 들어 dir1
다음 구조를 사용합니다.
[dir1]$ tree
.
├── dir_inside
│ ├── file1
│ └── file2
└── other_dir
├── file1
└── file2
이제 dir2
외부에 존재하는 모든 파일( dir1
예: 생성 전에 존재했던 파일)에 주로 존재하는 파일에 대한 하드 링크라고 가정합니다.dir1
file1
file2
dir2
dir2
dir1
하드 링크는 한 번만 계산되므로 크기 를 계산할 때 dir1
이 명령을 사용합니다 . 좋아, 지금까지는 괜찮았지만 한 번만 계산됩니다. 즉, 실제로 에 있는 첫 번째 하드 링크부터 계산을 시작하지 않는다는 의미입니다 . 그래서 우리는 크기 라고 말할 수 있습니다 . 해당 디렉토리 구조에서 하드 링크가 한 번만 계산되므로 크기 에도 영향을 미칩니다. 하드 링크에 대해 내가 아는 바에 따르면 하드 링크는 실제로 처음 생성된 파일 크기와 파일 크기가 같지 않습니다. 그렇죠? 하드 링크가 차지하는 실제 디스크 공간을 추정하기 위해 다른 디렉토리에 있는 하드 링크 파일의 디렉토리 크기를 얻는 방법에 대한 명확한 설명을 듣고 싶습니다.du -sh dir1
du
dir2
du -sh dir2
2G
dir1
2G
inode
답변1
하드링크 개념을 잘못 이해하신 것 같습니다.
file[name]은 inode에 대한 포인터이며 하드 링크는 정확히 동일합니다. 원본 문서에 대한 참조가 없습니다.
du
파일이 다른 파일에 대한 하드 링크로 생성되었는지 알 수 있는 방법이 없습니다. du
단일 호출 du
에서 inode에 대한 여러 포인터가 발생하는 경우에만 필터링이 가능합니다 .
du -sh dir1 dir2
답변2
하드 링크에 대해 몇 가지 오해가 있습니다.
가장 먼저 주목해야 할 점은 그러한 것이 없거나 모든 파일[이름]이 하드 링크라는 것입니다.
예, 맞습니다. 하드 링크에는 특별한 구조가 없습니다. 그래서 그들은 무엇입니까?
모든 파일에는 inode가 있습니다. Inode는 파일 모드, 크기, 날짜 등 콘텐츠와 메타데이터를 가리킵니다.
그런 다음 파일 이름이 나옵니다. 각 파일 이름은 inode를 가리킵니다. 각 inode에는 이를 가리키는 파일 이름이 0개 이상 있을 수 있습니다. (각 inode에는 이를 가리키는 열린 파일 설명자(프로세스 소유)가 0개 이상 있을 수 있습니다.) 파일 이름이 없고 inode를 가리키는 파일 설명자가 없으면 가비지 수집됩니다.
이러한 파일 이름과 파일 설명자의 생성 순서는 기록되지 않습니다. 따라서 이것이 하드링크이고 원본이라고 할 수는 없습니다. 이러한 구별은 생성 시에만 존재합니다. 그 이후에는 차이가 없습니다.