GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Warum gibt Ls -l eine andere Größe als Ls -s aus?

Ich kann nicht herausfinden, warum ich die folgenden Ergebnisse erhalte:

ls -l sagt mir, dass die Größe einer bestimmten Datei (HISTORY) „581944“ ist:

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

ls -s sagt, es sei „572“:

$ ls -s HISTORY
572 HISTORY

Ich muss natürlich die Werte mit einer vergleichbaren Skala verwenden. Also bestätige ich das zuerst mit --block-size 1 in ls -l gibt mir das gleiche Ergebnis wie zuvor:

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

Dann mache ich dasselbe mit ls -s um einen Wert in derselben Skala zu erhalten:

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

Unterschiedliche Ergebnisse! 581944 ≠ 585728 .

Ich habe versucht, vergleichbare Werte andersherum mit -k zu generieren , aber ich bekomme:

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

Wieder andere Ergebnisse, 569 ≠ 572 .

Ich habe versucht, –si anzugeben, um sicherzustellen, dass beide Optionen dieselbe Skala verwenden, ohne Erfolg:

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

…wieder andere Werte:582k ≠ 586k .

Ich habe versucht, das Web zu durchsuchen, aber das Einzige, was ich finden konnte, war das Folgende:

Einige Dateien haben „Löcher“, sodass die Verwendung durch ls -s aufgelistet wird (…) ist kleiner als die von ls -l angegebene Dateigröße .“

(Beachten Sie, dass in meinen Ergebnissen das Gegenteil passiert:ls -s gibt Größen größer als ls -l zurück , nicht kleiner.)

Inzwischen sagt diese Seite das

es gibt keinen eleganten Weg, Unix-Dateilöcher zu erkennen.

Wie kann ich also mit dieser Diskrepanz umgehen? Welcher dieser Werte kann als richtig angesehen werden? Könnte dies möglicherweise ein Fehler in ls sein ?

Beste Antwort

Kurze Antwort:

  • ls -l gibt die Größe der Datei an (=die darin enthaltene Datenmenge)
  • ls -s --block-size 1 gibt die Größe der Datei im Dateisystem an

Erstellen wir zwei Dateien:

Eine Spase-Datei von 128 Bytes Länge (Eine Sparse-Datei ist eine Datei, die leere Blöcke enthält, siehe Sparse-Datei):

# 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

Eine weitere Datei mit Zufallsdaten, ebenfalls 128 Byte groß:

# 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  |[email protected]#.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

Wie Sie also in der Hex-Darstellung sehen können, haben beide Dateien die gleiche Datenmenge , obwohl der Inhalt ganz anders ist.

Verwandte:Ubuntu 16.10 auf DELL XPS 13 9360 – (wie) verwende ich Intel-Grafiktreiber?

Sehen wir uns nun das Verzeichnis an:

# 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

Der erste Wert wird durch -s --block-size 1 angegeben Option, es ist die Speicherplatzmenge, die von der Datei im Dateisystem verwendet wird .

Wie Sie sehen können, nimmt die Sparse-Datei keinen Speicherplatz ein, da das Dateisystem (ext3 in diesem Fall) war schlau genug zu erkennen, dass es nur Nullen enthält. Außerdem nimmt die Datei mit Zufallsdaten 1024 Bytes auf der Festplatte ein!

Der Wert hängt davon ab, wie das zugrunde liegende Dateisystem Dateien behandelt (Blockgröße, Sparse-Dateifähigkeit, …).

In der sechsten Spalte steht die Größe der Datei, wenn Sie sie lesen würden – es ist die Datenmenge, die die Datei enthält und es sind 128 Bytes für beide Dateien!


Ubuntu
  1. Warum verschlingt die Shell-Befehlsersetzung ein nachgestelltes Newline-Zeichen?

  2. Die Ausgabe von Ls hat Zeilenumbrüche, wird aber in einer einzigen Zeile angezeigt. Wieso den?

  3. Wie kann `date` die Uhrzeit aus einer anderen Zeitzone ausgeben?

  4. Warum fügt die Ssh -t Option Cr &Lf in der umgeleiteten Ausgabe hinzu?

  5. warum unterscheidet sich die Ausgabe von `du` oft so sehr von `du -b`

Telnet vs. SSH:Wie unterscheidet sich SSH von Telnet?

Wie kann man die Ausgabe eines Php-Skripts sehen?

Warum sieht Libreoffice alt aus?

Warum zählt uniq identische Wörter als unterschiedlich?

Warum generiert Clang bei der Weiterleitung unverständlichen Text?

Warum zeigt top eine andere Anzahl von Kernen an als cpuinfo?