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_size
là 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=1
biến môi trường GNU (để lấy các đơn vị 512 byte) hoặc -k
cờ để buộc các đơn vị 1kB.
physical_block_size
là 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 %B
giá trị trên stat
hoặ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 -s
trả 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, stat
chúng ta thấy một tập hợp các giá trị khác nhau. Chạy stat
trong 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:
stat
báo cáo cả physical_blocks_in_use
và physical_block_size
như đượ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 -l
thư 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 ls
trên hệ thống của tôi không đề cập đến dòng đó, nhưnginfo coreutils ls
có. Làm thế nào đếnman ls
vàinfo coreutils ls
có thông tin khác nhau về cùng một lệnh? Tại sao khôngls
chỉ 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.