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

Warum stimmen Ls und Hexdump nicht über die Dateigröße überein?

Ich habe eine Datei, die ich (in vim) zu Testzwecken erstellt habe (Testen der UTF-8-Ausgabe in einem SSH-Client). Mit dieser Datei passieren jedoch seltsame Dinge.

Ich habe mich gefragt, welche Bytes in der Datei sind, also habe ich hexdump verwendet :

[email protected]:~$ hexdump -x intl.txt
0000000    9ecf    000a
0000003

Ok, da sind vier Bytes drin, wie die 00 und die 0a da reingekommen sind, ist mir nicht klar, aber egal. Hier wird es jedoch seltsam:

[email protected]:~$ ls -al intl.txt
-rw-rw-r-- 1 username username 3 Mar 26 15:14 intl.txt

Warte, es sind drei Bytes? Was ist hier los?

Als ob das nicht seltsam genug wäre, hexdump -C gibt sehr unterschiedliche Ausgabe:

[email protected]:~$ hexdump -C intl.txt
00000000  cf 9e 0a                                          |...|
00000003

Vim ist auch etwas verwirrt über die Datei. Wenn ich es starte, steht in der Statuszeile:

"intl.txt" 1L, 3C

Ganz oben bekomme ich dies jedoch (mithilfe von set list ):

Ϟ$
~
~
~
~

Es denkt also, dass es 3 Zeichen gibt, druckt aber nur eines. Ich könnte es verstehen, wenn es die Koppa und eine Leerzeile darunter drucken würde…

Akzeptierte Antwort:

Wie andere darauf hingewiesen haben, liegt dies daran, dass hexdump -x behandelt die Dateien so, als ob sie 2-Byte-Wörter enthalten. Auf Little-Endian-Systemen (fast alle Desktops) bedeutet dies, dass die Bytes ausgetauscht werden, bevor sie angezeigt werden. Das bedeutet, dass die Bytewerte paarweise gedruckt werden und dass die Reihenfolge dieser Bytes vertauscht wird. Da Sie eine ungerade Anzahl von Bytes haben, hexdump fügt einfach eine Null hinzu, um das letzte Paar zu bilden. Die Null wird dann mit dem 0a vertauscht . Dies ist ein dokumentiertes Verhalten für hexdump , also lügt es dich nicht an!

Mit hexdump -C ist ein besserer Befehl, um eine formatierte Ausgabe zu erhalten, die die Bytes in der Reihenfolge anzeigt, in der sie sich in der Datei befinden. Auch die 0a ist eine neue Zeile und wurde wahrscheinlich stillschweigend hinzugefügt, von dem, was auch immer die Datei erstellt hat (vim tut dies standardmäßig). ZB echo fügt immer eine neue Zeile hinzu, wenn Sie es nicht sagen. In bash :

echo -e '\xcf\x9e' | hexdump -C

wird dasselbe Ergebnis liefern, aber den Zeilenumbruch mit -n unterdrücken geben, was Sie erwartet haben:

echo -ne '\xcf\x9e' | hexdump -C

Um vim zu stoppen vom Hinzufügen des Zeilenumbruchs:

:set noeol
:set binary

Linux
  1. Warum ändert der folgende Weg die Größe der Kerndatei nicht?

  2. Der Unterschied zwischen .exrc und .vimrc?

  3. Io-Umleitung und der Head-Befehl?

  4. Warum wird der Dateideskriptor nur einmal geöffnet und gelesen?

  5. So erhalten Sie die Größe von tar.gz in (MB) Datei in Python

So verwenden Sie Sudo und die Sudoers-Datei

So speichern Sie eine Datei in Vim / Vi und beenden den Editor

Was ist ZFS? Warum sind die Leute verrückt danach?

Tragbarer Weg, um die Dateigröße (in Bytes) in der Shell zu erhalten?

Finden Sie die Größe und den freien Speicherplatz des Dateisystems, das eine bestimmte Datei enthält

Wie erhalte ich die physische Größe einer Datei unter Linux?