GNU/Linux >> Linux Esercitazione >  >> Linux

Perché Ls e Hexdump non sono d'accordo sulla dimensione del file?

Ho un file che ho creato (in vim), a scopo di test (test dell'output UTF-8 in un client SSH). Cose strane, tuttavia, stanno accadendo a questo file.

Mi chiedevo quali byte ci fossero nel file, quindi ho usato hexdump :

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

Ok, ci sono quattro byte lì dentro, come sono entrati lo 00 e lo 0a, non sono chiaro, ma qualunque cosa. Ecco dove diventa strano, però:

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

Aspetta, sono tre byte? Cosa sta succedendo qui?

Come se non fosse abbastanza strano, hexdump -C fornisce un output molto diverso:

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

Vim è anche un po' confuso riguardo al file. Quando lo avvio, nella riga di stato viene visualizzato questo:

"intl.txt" 1L, 3C

In alto, tuttavia, ottengo questo (usando set list ):

Ϟ$
~
~
~
~

Quindi, pensa che ci siano 3 caratteri, ma ne stampa solo uno. Potrei capire se stampasse la koppa e una riga vuota sotto di essa...

Risposta accettata:

Come altri hanno sottolineato, ciò è dovuto al fatto che hexdump -x tratta i file come contenenti parole a 2 byte. Sui sistemi little endian (quasi tutti i desktop lo sono), questo significa che i byte verranno scambiati prima di essere visualizzati. Ciò significa che i valori dei byte vengono stampati a coppie e che l'ordine di questi byte viene scambiato. Dato che hai un numero dispari di byte, hexdump aggiunge solo uno zero per formare la coppia finale. Lo zero viene quindi scambiato con il 0a . Questo è un comportamento documentato per hexdump , quindi non ti sta mentendo!

Usando hexdump -C è un comando migliore per ottenere un output formattato che mostra i byte nell'ordine in cui sono nel file. Anche il 0a è una nuova riga ed è stata probabilmente aggiunta tranquillamente da qualunque cosa abbia creato il file (vim lo fa per impostazione predefinita). Ad esempio, echo aggiungerà sempre una nuova riga se non gli dici di non farlo. In bash :

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

darà lo stesso risultato, ma sopprimendo la nuova riga con -n darà quello che ti aspettavi:

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

Per fermare vim dall'aggiunta della nuova riga:

:set noeol
:set binary

Linux
  1. Perché lo script Bash non riconosce gli alias?

  2. Perché il modo seguente non cambia la dimensione del limite del file principale?

  3. La differenza tra .exrc e .vimrc?

  4. Perché Ls -l non mostra l'ora e l'anno per ogni file??

  5. Trovare la dimensione del settore di una partizione?

Come usare Sudo e il file Sudoers

Come salvare un file in Vim/Vi e uscire dall'editor

Cos'è ZFS? Perché le persone ne vanno pazze?

Come rimuovere X byte dalla fine di un file di grandi dimensioni senza leggere l'intero file?

Come elencare la dimensione di ogni file e directory e ordinare per dimensione decrescente in Bash?

Perché la directory principale è indicata da un segno /?