Execute dd a partir do arquivo de entrada, excluindo os últimos 4 bytes de cada bloco

0

Eu tenho um arquivo muito grande (999.952.379.904 bytes para ser preciso), que é uma imagem de disco parcial. Olhando para ele em um editor hexadecimal, descobri que a estrutura é a seguinte:

  • 0-2073 byte offsets contém algumas informações de cabeçalho adicionadas pela ferramenta que criou o arquivo. Eu posso ignorá-los.

  • 2074 bytes em diante são blocos de 1048580 bytes compreendendo 1048576 de dados seguido por um valor de CRC de 4 bytes.

Estou procurando uma maneira eficiente de começar com um deslocamento de 2074 bytes e copiar os blocos de 1048580 bytes, excluindo os valores de CRC de 4 bytes até o final do arquivo de entrada. Parece que o arquivo não termina com um bloco completo, então eu excluiria o último bloco ou o preencheria com zeros.

dd pode claramente acomodar a partir de um deslocamento, mas existe alguma maneira de excluir os últimos 4 bytes em cada bloco ao copiar?

    
por Tinkerer 15.08.2015 / 19:23

1 resposta

1

Você provavelmente teria que criar um loop bash e ter dd pulando os bytes necessários para cada bloco.

Escrever um programa simples em C é mais fácil.

$ cat >cvt.c
#include <unistd.h>
#include <string.h>

#define SKIPBYTES (2074)

#define BUFSIZE (1048580)
#define STRIPBYTES (4)

void main()
{
  char buf[BUFSIZE];                /* buffer to hold one block of data to tranfser */
  ssize_t count=0;

  read(0,buf,SKIPBYTES);            /* read initial data to skip */

  while (1)
    {
    memset( (void *)buf,0,BUFSIZE); /* fill with zero-bytes */
    count=read(0,buf,BUFSIZE);         /* possibly read a full buffer */
    if (count>0)
      write(1,buf,BUFSIZE-STRIPBYTES); /* write almost all bytes */
    else
      break;
    };

}

Pressione e segure a tecla CTRL e pressione d uma vez.

$ gcc -o cvt cvt.c
$ chmod 755 cvt
$ ./cvt <largefile.raw >filtered-file.dd

Nota: "fd" 0 é stdin, 1 é stdout, 2 é stderr
 Verificar:
$ man leia
$ man 2 write

    
por 16.08.2015 / 00:08

Tags