du
파일에 사용된 블록 수를 계산하는 방법을 알고 싶습니다 .
상상하다
dd bs=1 seek=2GiB if=/dev/null of=big
0+0 records in
0+0 records out
0 bytes (0 B) copied, 2.3324e-05 s, 0.0 kB/s
ls -lh big
-rw-r--r-- 1 roaima roaima 2.0G May 19 15:55 big
du -h big
0 big
나는 항상 그것이 나에게 다른 대답을 줄 것이라고 생각했습니다 ls
. 그것은 서로 다른 것을 측정하기 때문에 괜찮습니다.
이제 클라우드 기반 파일 시스템이 있고 스토리지 비용뿐만 아니라 데이터를 다운로드할 때마다 비용을 지불하고 있으므로 "이 트리가 디스크 공간을 얼마나 사용하고 있는지"와 같은 일반적인 관리 활동을 위해 액세스하는 데이터 양을 최소화해야 합니다. ?
사용된 블록의 수를 알려줄 수 있는 라이브러리/시스템 호출은 없지만 아마도 하나는 있을 것입니다. 나는 du
그것이 0으로 가득 찬 파일과 정말로 희소한 파일을 구별할 수 없기 때문에 그것이 고려 중인 모든 파일을 읽는다고 믿지 않습니다 .
그렇다면 du
사용된 블록 수는 어떻게 계산합니까?
답변1
du
사용stat(2)
파일이 사용하는 블록 수를 찾습니다. 실행해 보면 stat big
블록 수가 주어진 수와 일치하는 것을 볼 수 있습니다 du
.
du
이 옵션을 사용하여 바이트 수를 강제로 계산 -b
하면 출력이 ls
와 일치합니다.
두 경우 모두 다음을 사용합니다 stat(2)
(또는 적어도 fstatat(2)
제가 가지고 있는 버전에서는):
$ strace du big|&grep big
execve("/usr/bin/du", ["du", "big"], [/* 57 vars */]) = 0
newfstatat(AT_FDCWD, "big", {st_mode=S_IFREG|0644, st_size=2147483648, ...}, AT_SYMLINK_NOFOLLOW) = 0
write(1, "0\tbig\n", 60 big
가공의 차이는에서 볼 수 있음du.c
.