Como faço para cortar bytes do início e do final de um arquivo?

Como faço para cortar bytes do início e do final de um arquivo?

Eu tenho um arquivo que contém lixo (cabeçalho e rodapé binários) no início e no final do arquivo. Eu gostaria de saber como destruir esses bytes. Por exemplo, vamos supor 25 bytes desde o início. E, 2 bytes do final.

Eu sei que posso usar truncate e dd, mas truncate não funciona com um stream e parece meio complicado executar dois comandos no arquivo rígido. Seria melhor se truncate, sabendo o tamanho do arquivo, pudesse catá-lo para dd. Ou se houvesse uma maneira melhor de fazer isso?

Responder1

Você pode combinar GNUtailehead:

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

produzirá o conteúdo filecomeçando no byte 26 e parando dois bytes (menos dois -2) antes do final. ( -copera em bytes, não em caracteres.)

Responder2

ddfará as duas coisas por você em um único comando. Defina o tamanho do bloco para 1 byte, pule os 25 primeiros bytes, conte até o tamanho do arquivo menos os bytes de salto e final.

100 byte file
file.img

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

Verifique novamente os números porque eles podem contar a partir de 0.

Responder3

Com ksh93:

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

Ou para fazer isso no local:

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

Se você tiver /opt/ast/binà frente do seu $PATH, você obterá o headarquivo embutido.

  • <#((...))é um lseek()operador. ...é interpretado como uma expressão aritmética onde EOFé o comprimento do arquivo. Acima, estamos atribuindo o comprimento da parte a ser exibida $ne buscando 25 bytes dentro do arquivo.
  • <>;é um operador de redirecionamento aberto em leitura + modo de gravação e truncamento se o comando for bem-sucedido.

informação relacionada