Como redimensionar bytes do começo e do fim de um arquivo?

4

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

Eu sei que eu posso usar truncate e dd, mas truncar não funciona com um fluxo e parece meio chato executar dois comandos no arquivo rígido. Seria melhor se truncate , sabendo o tamanho do arquivo, pudesse colocar o arquivo em dd . Ou, se houvesse uma maneira mais agradável de fazer isso?

    
por Evan Carroll 24.05.2017 / 22:38

3 respostas

9

Você pode combinar o GNU tail e < href="https://www.gnu.org/software/coreutils/manual/html_node/head-invocation.html#head-invocation"> head :

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

produzirá o conteúdo de file iniciando no byte 26 e parando dois bytes (menos dois -2 ) antes do final. ( -c opera em bytes, não em caracteres.)

    
por 24.05.2017 / 22:55
3

dd fará ambos para você em um único comando. Defina o tamanho do bloco para 1 byte, ignore os 25 primeiros bytes, conte para o tamanho do arquivo menos os bytes de salto e fim.

100 byte file
file.img

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

Verifique os números, pois isso pode contar a partir de 0.

    
por 24.05.2017 / 22:58
2

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 , obterá o head incorporado.

  • <#((...)) é um operador lseek() . ... é interpretado como uma expressão aritmética em que EOF é o tamanho do arquivo. Então, acima, estamos atribuindo o comprimento da parte para exibir a $n e procurando 25 bytes dentro do arquivo.
  • <>; é um operador de redirecionamento aberto em leitura + modo de gravação e truncamento-se-o-comando-é-sucedido.
por 24.05.2017 / 23:57

Tags