Neden ls -l, ls -s'den farklı bir ebat üretir?


38

Aşağıdaki sonuçları neden aldığımı çözemiyorum:

ls -l Bana belirli bir dosyanın boyutunu (TARİHİ) "581944" olduğunu söyler:

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

ls -s "572" olduğunu söylüyor:

$ ls -s HISTORY
572 HISTORY

Açıkça değerleri karşılaştırılabilir bir ölçek kullanmam gerekiyor. Kullanarak bu nedenle ilk önce onayla --block-size 1içinde ls -lbana daha önce olduğu gibi aynı sonucu verir:

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

Sonra ls -saynı ölçekte bir değer elde etmek için aynısını yapıyorum :

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

Farklı sonuçlar! 581944 ≠ 585728 .

Başka yerlerde karşılaştırılabilir değerler üretmeyi denedim, onu kullandım -k, ancak alıyorum:

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

Yine farklı sonuçlar, 569 ≠ 572 .

Her iki seçeneğin de aynı ölçeği kullandığından emin olmak için --si belirtmeyi denedim, boşuna:

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

... tekrar, farklı değerler: 582k ≠ 586k .

Ben web'de arama denedim ama alakalı gibiydi bulabildiğim tek şeydi bu :

Bazı dosyalarda "delikler" vardır, bu nedenle ls -s(...) tarafından listelenen kullanım, tarafından listelenen dosya boyutundan daha azdır ls -l. "

(sonuçlarımda bunun tersinin gerçekleştiğini unutmayın: ls -sboyutları daha ls -lküçük değil, daha büyükse döndürür .)

Bu arada, bu sayfa diyor ki

Unix dosya deliklerini tespit etmenin zarif bir yolu yoktur.

Peki bu tutarsızlıkla nasıl başa çıkabilirim? Bu değerlerden hangisi doğru kabul edilebilir? Bu muhtemelen bir hata olabilir lsmi?

Yanıtlar:


47

Kısa cevap:

  • ls -l dosyanın boyutunu verir (= içerdiği veri miktarı)
  • ls -s --block-size 1 dosya sistemindeki dosyanın boyutunu verir

İki dosya oluşturalım:

Bir seyrek dosya 128 uzunluğunu bayt (seyrek dosya boş blokları içeren bir dosya, bunun için bakınız Seyrek Dosya ):

# 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

128 bayt boyutunda rastgele veri içeren başka bir dosya:

# 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

Dolayısıyla, onaltılık gösterimlerde de görebileceğiniz gibi , içerik oldukça farklı olmasına rağmen her iki dosya da aynı miktarda veriye sahiptir .

Şimdi dizine bakalım:

# 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

İlk değer -s --block-size 1seçenek tarafından verilir , dosya sisteminde dosya tarafından kullanılan alan miktarıdır .

Gördüğünüz gibi, seyrek dosya sıfır yer kaplıyor, çünkü dosya sistemi ( ext3bu durumda) yalnızca sıfır içerdiğini kabul edecek kadar akıllıydı. Ayrıca, rasgele veri içeren dosya diskte 1024 bayt alır!

Bu değer, temel dosya sisteminin dosyaları nasıl ele aldığına (blok boyutu, seyrek dosya yeteneği, ...) bağlıdır.

Altıncı sütunda dosyanın boyutunu okuyacak olursanız , dosyanın içerdiği veri miktarıdır ve her iki dosya için de 128 bayttır!


1
Muhtemelen, boş bir dosya veya boş değerlere sahip bir dosya bile, dosya dağıtım tablosunda bir yere yer kaplar mı? Bunu neden ls -ssaymıyorsun?
Flimm

2
Dosyalarla ilgili meta veriler inode'da depolanır. Her dosya sisteminin kullanabileceği sınırlı sayıda inode vardır. Bir dosya sisteminin kaç tane boş inode olduğunu ve boyutlarını görmek için: sudo tune2fs -l /dev/sdaX|grep Inodeveya df -itüm bölümler için.
phoibos

1
Bunu doğrulamak için ilginç, yapay olmayan bir yol buldum: torrent .part dosyaları delikli dosyalara iyi bir örnek gibi görünüyor: ls -lsh ~/Downloads/torrentsmesela bana 92K -rw-r--r-- 1 waldir waldir 350M Sep 15 2012 video.avi.part. Yani, 92K olduğunu -s seçeneği tarafından döndürülen, dosya, sürer dosya sistemi-bilge ve 350M gerçek alandır, l seçeneği tarafından döndürülen dosya tam boyutu olur tamamen indirilmiş olsaydı sahip (yani eğer tüm baytlar baştan sona sıfır olsaydı). Bkz lists.freebsd.org/pipermail/freebsd-questions/2012-June/...
waldyrious

14

ls -sSize her zaman ayırma biriminin bir katı olan dosyanın ayrılan boyutunu bildirir . ls -lgerçek boyutu söyler. Test etmenin kolay bir yolu:

$ 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.