¿Cómo recorto bytes del principio y del final de un archivo?

¿Cómo recorto bytes del principio y del final de un archivo?

Tengo un archivo que tiene papelera (encabezado y pie de página binarios) al principio y al final del archivo. Me gustaría saber cómo destruir estos bytes. Por ejemplo, supongamos 25 bytes desde el principio. Y a 2 bytes del final.

Sé que puedo usar truncate y dd, pero truncate no funciona con una secuencia y parece un poco complicado ejecutar dos comandos en el archivo duro. Sería mejor si truncate, sabiendo el tamaño del archivo, pudiera enviarlo a dd. ¿O si hubiera una manera mejor de hacer esto?

Respuesta1

Puedes combinar GNUtailyhead:

tail -c +26 file | head -c -2

generará el contenido filecomenzando en el byte 26 y deteniendo dos bytes (menos dos -2) antes del final. ( -copera en bytes, no en caracteres).

Respuesta2

ddhará ambas cosas por usted con un solo comando. Establezca el tamaño del bloque en 1 byte, omita los primeros 25 bytes, cuente hasta el tamaño del archivo menos los bytes omitidos y finales.

100 byte file
file.img

dd if=./file.img of=./trimed_file.img bs=1 skip=25 count=73

Verifique dos veces los números porque podría contar desde 0.

Respuesta3

Con ksh93:

{ head -c "$n"; } < file <#((n = EOF - 25 - 2 , 25))

O hacerlo in situ:

{ head -c "$n"; } < file <#((n = EOF - 25 - 2 , 25)) 1<>; file

Si lo tiene /opt/ast/binpor delante $PATH, obtendrá el headincorporado.

  • <#((...))es un lseek()operador. ...se interpreta como una expresión aritmética donde EOFes la longitud del archivo. Entonces, arriba, asignamos la longitud de la parte a mostrar $ny buscamos 25 bytes dentro del archivo.
  • <>;es un operador de redirección abrir en modo lectura+escritura y truncar si el comando tiene éxito.

información relacionada