Tại sao ls -l xuất ra một kích thước khác với ls -s?


38

Tôi không thể hiểu tại sao tôi nhận được kết quả sau:

ls -l cho tôi biết kích thước của một tệp đã cho (LỊCH SỬ) là "581944":

$ ls -l HISTORY 
-rw-rw-r-- 1 waldyrious waldyrious 581944 Feb 22 10:59 HISTORY

ls -s nói rằng đó là "572":

$ ls -s HISTORY
572 HISTORY

Tôi rõ ràng cần phải làm cho các giá trị sử dụng một thang so sánh. Vì vậy, trước tiên tôi xác nhận rằng sử dụng --block-size 1in ls -lcho tôi kết quả giống như trước:

$ ls -l --block-size 1 HISTORY 
-rw-rw-r-- 1 waldyrious waldyrious 581944 Feb 22 10:59 HISTORY

Sau đó, tôi làm tương tự ls -sđể có được một giá trị trong cùng một tỷ lệ:

$ ls -s --block-size 1 HISTORY 
585728 HISTORY

Kết quả khác nhau! 581944 585728 .

Tôi đã thử tạo các giá trị tương đương theo cách khác, bằng cách sử dụng -k, nhưng tôi nhận được:

$ ls -lk HISTORY 
-rw-rw-r-- 1 waldyrious waldyrious 569 Feb 22 10:59 HISTORY
$ ls -sk HISTORY 
572 HISTORY

Một lần nữa, kết quả khác nhau, 569 572 .

Tôi đã thử chỉ định --si để đảm bảo cả hai tùy chọn đều sử dụng cùng một tỷ lệ, nhưng không có kết quả:

$ ls -lk --si HISTORY 
-rw-rw-r-- 1 waldyrious waldyrious 582k Feb 22 10:59 HISTORY
$ ls -sk --si HISTORY 
586k HISTORY

... một lần nữa, các giá trị khác nhau: 582k 586k .

Tôi đã cố gắng tìm kiếm trên web, nhưng điều duy nhất tôi có thể thấy rằng dường như có liên quan là này :

Một số tệp có "lỗ hổng" trong đó, do đó mức sử dụng được liệt kê bởi ls -s(...) nhỏ hơn kích thước tệp được liệt kê bởi ls -l. "

(lưu ý rằng trong kết quả của tôi, điều ngược lại xảy ra: ls -strả về kích thước lớn hơn ls -l, không nhỏ hơn.)

Trong khi đó, trang này nói rằng

không có cách nào thanh lịch để phát hiện các lỗ tập tin Unix.

Vì vậy, làm thế nào tôi có thể đối phó với sự khác biệt này? Những giá trị nào trong số này có thể được coi là chính xác? Điều này có thể là một lỗi trong ls?

Câu trả lời:


47

Câu trả lời ngắn:

  • ls -l đưa ra kích thước của tệp (= lượng dữ liệu chứa trong đó)
  • ls -s --block-size 1 đưa ra kích thước của tệp trên hệ thống tệp

Hãy tạo hai tệp:

Một tệp thưa có chiều dài 128 byte (Tệp thưa là tệp chứa các khối trống, xem Tệp thưa ):

# truncate -s 128 f_zeroes.img
# hexdump -vC f_zeroes.img 
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000080

Một tệp khác có dữ liệu ngẫu nhiên, cũng có kích thước 128 byte:

# dd if=/dev/urandom of=f_random.img bs=1 count=128
# hexdump -vC f_random.img 
00000000  bc 82 9c 40 04 e3 0c 23  e6 76 79 2f 95 d4 0e 45  |...@...#.vy/...E|
00000010  19 c6 53 fc 65 83 f8 58  0a f7 0e 8f d6 d6 f8 b5  |..S.e..X........|
00000020  6c cf 1b 60 cb ef 06 c6  d0 99 c6 16 3f d3 95 02  |l..`........?...|
00000030  85 1e b7 80 27 93 27 92  d0 52 e8 72 54 25 4d 90  |....'.'..R.rT%M.|
00000040  11 59 a2 d9 0f 79 aa 23  2d 44 3d dd 8d 17 d9 36  |.Y...y.#-D=....6|
00000050  f5 ae 07 a8 c1 b4 cb e1  49 9e bc 62 1b 4f 17 53  |........I..b.O.S|
00000060  95 13 5a 1c 2a 7e 55 b9  69 a5 50 06 98 e7 71 83  |..Z.*~U.i.P...q.|
00000070  5a d0 82 ee 0b b3 91 82  ca 1d d0 ec 24 43 10 5d  |Z...........$C.]|
00000080

Vì vậy, như bạn có thể thấy trong biểu diễn hex, cả hai tệp có cùng một lượng dữ liệu , mặc dù nội dung khá khác nhau.

Bây giờ, chúng ta hãy xem thư mục:

# ls -ls --block-size 1 f_*
1024 -rw-r--r-- 1 user user 128 Mar 18 15:34 f_random.img
   0 -rw-r--r-- 1 user user 128 Mar 18 15:32 f_zeroes.img
   ^                         ^
   |                         |
Amount which the           Actual file size
files takes on the fs

Giá trị đầu tiên được đưa ra bởi -s --block-size 1tùy chọn, đó là dung lượng được sử dụng bởi tệp trên hệ thống tệp .

Như bạn có thể thấy, tệp thưa thớt chiếm không gian, vì hệ thống tệp ( ext3trong trường hợp này) đủ thông minh để nhận ra rằng nó chỉ chứa số không. Ngoài ra, tệp có dữ liệu ngẫu nhiên chiếm 1024 byte trên đĩa!

Giá trị phụ thuộc vào cách hệ thống tệp bên dưới xử lý tệp (kích thước khối, khả năng tệp thưa, ...).

Trong cột thứ sáu là kích thước của tệp nếu bạn đọc nó - đó là lượng dữ liệu mà tệp chứa và đó là 128 byte cho cả hai tệp!


1
Có lẽ, ngay cả một tệp trống hoặc tệp chứa đầy giá trị null sẽ chiếm không gian trong bảng phân bổ tệp ở đâu đó? Tại sao không ls -stính điều đó?
Flimm

2
Siêu dữ liệu về các tập tin được lưu trữ trong inodes. Mỗi hệ thống tập tin có một số lượng hạn chế mà nó có thể sử dụng. Để xem có bao nhiêu nút miễn phí mà một hệ thống tệp có và kích thước của chúng : sudo tune2fs -l /dev/sdaX|grep Inode, hoặc df -icho tất cả các phân vùng.
phoibos

1
Tôi chỉ tìm thấy một cách thú vị, phi nhân tạo để xác minh điều này: các tệp torrent .part dường như là ví dụ tốt về các tệp có lỗ: ls -lsh ~/Downloads/torrentsví dụ, cho tôi 92K -rw-r--r-- 1 waldir waldir 350M Sep 15 2012 video.avi.part. Nghĩa là, 92K, được trả về bởi tùy chọn -s, là không gian thực tế mà tệp mất, hệ thống tệp và 350M, được trả về bởi tùy chọn -l, là kích thước đầy đủ mà tệp sẽ có nếu được tải xuống hoàn toàn (nghĩa là nếu tất cả các byte, từ đầu đến cuối, đều khác không). Xem danh sách.freebsd.org/pipermail/freebsd
waldyrious

14

ls -scho bạn biết kích thước được phân bổ của tệp, luôn là bội số của đơn vị phân bổ. ls -lcho biết kích thước thực tế. Một cách dễ dàng để kiểm tra:

$ echo 1 > sizeTest
$ ls -l --block-size 1 sizeTest 
-rw-rw-r-- 1 g g 2 Mär 18 15:18 sizeTest
$ ls -s --block-size 1 sizeTest 
4096 sizeTest
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.