공식 : 그 숫자 는 무엇입니까 ?
total int = 각 파일에 대한 (physical_blocks_in_use) * physical_block_size / ls_block_size)의 합 .
어디:
ls_block_size
인 임의의 환경 변수 자유롭게 수정할 수있다 (일반적으로 512 또는 1024 바이트)
--block-size=<int>
의 플래그 ls
1, POSIXLY_CORRECT=1
GNU 환경 변수, 또는 (512 바이트 단위에 도착) -k
1KB 단위를 강제 플래그.
physical_block_size
내부 블록 인터페이스의 OS 종속 값으로 기본 하드웨어에 연결되거나 연결되지 않을 수 있습니다. 이 값은 일반적으로 512b 또는 1k이지만 OS에 전적으로 의존합니다. 또는 의 %B
값을 통해 공개 할 수 있습니다 . 이 값은 (거의 항상) 최신 저장 장치 의 물리적 블록 수와 관련이 없습니다 .stat
fstat
왜 그렇게 혼란 스러운가?
이 수치는 물리적 또는 의미있는 지표와 상당히 분리되어 있습니다. 많은 주니어 프로그래머들은 파일 홀 이나 하드 / 심볼 링크에 대한 경험이 없었습니다 . 또한이 특정 주제에 대한 문서는 사실상 존재하지 않습니다.
"블록 크기" 라는 용어의 불일치와 모호함은 수많은 다른 측정이 쉽게 혼동되고 디스크 액세스를 중심으로 비교적 깊은 추상화 수준으로 인해 발생했습니다.
상충되는 정보의 예 : du
(또는 ls -s
) vsstat
du *
프로젝트 폴더에서 실행 하면 다음이 생성됩니다. (참고 : ls -s
동일한 결과를 반환합니다.)
dactyl:~/p% du *
2 check.cc
2 check.h
1 DONE
3 Makefile
3 memory.cc
5 memory.h
26 p2
4 p2.cc
2 stack.cc
14 stack.h
합계 : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 블록
그러나 하나가 실행되면 stat
다른 값 세트가 나타납니다. stat
동일한 디렉토리에서 실행 하면 다음이 발생합니다.
dactyl:~/p% stat * --printf="%b\t(%B)\t%n: %s bytes\n"
3 (512) check.cc: 221 bytes
3 (512) check.h: 221 bytes
1 (512) DONE: 0 bytes
5 (512) Makefile: 980 bytes
6 (512) memory.cc: 2069 bytes
10 (512) memory.h: 4219 bytes
51 (512) p2: 24884 bytes
8 (512) p2.cc: 2586 bytes
3 (512) stack.cc: 334 bytes
28 (512) stack.h: 13028 bytes
합계 : 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 블록
참고 :stat * --printf="%b\t(%B)\t%n: %s bytes\n"
> 명령을 사용하여 위에 표시된 대로 블록 수, 블록 크기, 파일 이름 및 바이트 크기를 순서대로 출력 할 수 있습니다 .
테이크 아웃에는 두 가지 중요한 사항이 있습니다.
stat
리포트 모두 physical_blocks_in_use
와 physical_block_size
상기 화학식에서 사용. 이는 OS 인터페이스를 기반으로 한 값입니다.
du
물리적 디스크 사용률의 상당히 정확한 추정치 로 일반적으로 수용되는 것을 제공합니다 .
참고로, ls -l
위의 디렉토리 는 다음 과 같습니다.
dactyl:~/p% ls -l
**total 59**
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.cc
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.h
-rw-r--r--. 1 dhs217 grad 0 Oct 16 2013 DONE
-rw-r--r--. 1 dhs217 grad 980 Oct 16 2013 Makefile
-rw-r--r--. 1 dhs217 grad 2069 Oct 16 2013 memory.cc
-rw-r--r--. 1 dhs217 grad 4219 Oct 16 2013 memory.h
-rwxr-xr-x. 1 dhs217 grad 24884 Oct 18 2013 p2
-rw-r--r--. 1 dhs217 grad 2586 Oct 16 2013 p2.cc
-rw-r--r--. 1 dhs217 grad 334 Oct 16 2013 stack.cc
-rw-r--r--. 1 dhs217 grad 13028 Oct 16 2013 stack.h
man ls
내 시스템에서 그 라인을 언급하지는 않지만 말합니다info coreutils ls
. 어떻게되어 제공man ls
과info coreutils ls
같은 명령에 대한 다른 정보를? 왜ls
한 번만 문서화 되지 않습니까? 동일한 명령에 대해 서로 다른 두 개의 문서가 있으면 실패로 설정된 것처럼 보입니다.