GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué Ls y Hexdump no están de acuerdo sobre el tamaño del archivo?

Tengo un archivo que creé (en vim), con fines de prueba (probando la salida UTF-8 en un cliente SSH). Sin embargo, le están sucediendo cosas extrañas a este archivo.

Me preguntaba qué bytes había en el archivo, así que usé hexdump :

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

Ok, hay cuatro bytes allí, cómo llegaron allí el 00 y el 0a, no lo tengo claro, pero lo que sea. Sin embargo, aquí es donde se pone raro:

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

Espera, ¿son tres bytes? ¿Qué está pasando aquí?

Como si eso no fuera lo suficientemente extraño, hexdump -C da una salida muy diferente:

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

Vim también está un poco confundido acerca del archivo. Cuando lo inicio, da esto en la línea de estado:

"intl.txt" 1L, 3C

Arriba, sin embargo, obtengo esto (usando set list ):

Ϟ$
~
~
~
~

Entonces, cree que hay 3 caracteres, pero solo imprime uno. Podría entender si imprimiera el koppa y una línea en blanco debajo...

Respuesta aceptada:

Como han señalado otros, esto se debe a que hexdump -x trata los archivos como si contuvieran palabras de 2 bytes. En los sistemas little endian (casi todos los escritorios lo son), esto significa que los bytes se intercambiarán antes de que se muestren. Esto significa que los valores de los bytes se imprimen en pares y que se intercambia el orden de estos bytes. Como tiene un número impar de bytes, hexdump simplemente agrega un cero para formar el par final. Luego, el cero se intercambia con el 0a . Este es un comportamiento documentado para hexdump , ¡así que no te está mintiendo!

Usando hexdump -C es un mejor comando para obtener una salida formateada que muestre los bytes en el orden en que están en el archivo. También el 0a es una nueva línea y probablemente fue agregada silenciosamente por lo que sea que creó el archivo (vim hace esto por defecto). Por ejemplo, echo siempre agregará una nueva línea si no le dices que no lo haga. En bash :

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

dará el mismo resultado, pero suprimiendo la nueva línea con -n te dará lo que esperabas:

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

Para detener vim de agregar la nueva línea:

:set noeol
:set binary

Linux
  1. ¿Por qué la siguiente manera no cambia el tamaño límite del archivo principal?

  2. ¿La diferencia entre .exrc y .vimrc?

  3. ¿Por qué Ls -l no muestra la hora o el año de cada archivo?

  4. ¿Encontrar el tamaño del sector de una partición?

  5. ¿Manera portátil de obtener el tamaño del archivo (en bytes) en Shell?

Cómo usar Sudo y el archivo Sudoers

Cómo guardar un archivo en Vim/Vi y salir del editor

¿Qué es ZFS? ¿Por qué la gente está loca por eso?

¿Cómo enumerar el tamaño de cada archivo y directorio y ordenar por tamaño descendente en Bash?

¿Por qué el tamaño de un directorio siempre es de 4096 bytes en Unix?

¿Cómo obtener el tamaño físico de un archivo en Linux?