Công thức: Số đó là gì?
tổng int = Tổng của (vật lý_blocks_in_use) * vật lý_block_size / ls_block_size) cho mỗi tệp.
Ở đâu:
ls_block_sizelà một biến môi trường tùy ý (thường là 512 hoặc 1024 byte) có thể tự do sửa đổi với
--block-size=<int>cờ trên ls, POSIXLY_CORRECT=1biến môi trường GNU (để lấy các đơn vị 512 byte) hoặc -kcờ để buộc các đơn vị 1kB.
physical_block_sizelà giá trị phụ thuộc HĐH của giao diện khối bên trong, có thể hoặc không thể kết nối với phần cứng bên dưới. Giá trị này thường là 512b hoặc 1k, nhưng hoàn toàn phụ thuộc vào HĐH. Nó có thể được tiết lộ thông qua %Bgiá trị trên stathoặc fstat. Lưu ý rằng giá trị này (hầu như luôn luôn) không liên quan đến số khối vật lý trên thiết bị lưu trữ hiện đại .
Tại sao lại khó hiểu như vậy?
Con số này khá tách rời khỏi bất kỳ số liệu vật lý hoặc có ý nghĩa. Nhiều lập trình viên cơ sở chưa có kinh nghiệm với các lỗ tập tin hoặc liên kết cứng / sym . Ngoài ra, tài liệu có sẵn về chủ đề cụ thể này hầu như không tồn tại.
Sự rời rạc và mơ hồ của thuật ngữ "kích thước khối" là kết quả của nhiều biện pháp khác nhau dễ bị nhầm lẫn và mức độ trừu tượng tương đối sâu xoay quanh việc truy cập đĩa.
Ví dụ về thông tin xung đột: du(hoặc ls -s) vs.stat
Chạy du *trong thư mục dự án mang lại kết quả như sau: (Lưu ý: ls -strả về cùng kết quả.)
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
Tổng cộng : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 Khối
Tuy nhiên, khi chạy, statchúng ta thấy một tập hợp các giá trị khác nhau. Chạy stattrong cùng một thư mục mang lại:
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
Tổng cộng: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 Khối
Lưu ý: Bạn có thể sử dụng lệnh stat * --printf="%b\t(%B)\t%n: %s bytes\n"> để xuất (theo thứ tự) số lượng khối, (theo parens) kích thước của các khối đó, tên của tệp và kích thước theo byte, như được hiển thị ở trên.
Có hai điều quan trọng mang lại:
statbáo cáo cả physical_blocks_in_usevà physical_block_sizenhư được sử dụng trong công thức trên. Lưu ý rằng đây là những giá trị dựa trên giao diện HĐH.
duđang cung cấp những gì thường được chấp nhận như một ước tính khá chính xác về việc sử dụng đĩa vật lý.
Để tham khảo, đây là ls -lthư mục trên:
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 lstrên hệ thống của tôi không đề cập đến dòng đó, nhưnginfo coreutils lscó. Làm thế nào đếnman lsvàinfo coreutils lscó thông tin khác nhau về cùng một lệnh? Tại sao khônglschỉ là tài liệu một lần? Có hai tài liệu khác nhau cho cùng một lệnh có vẻ như được thiết lập cho thất bại.