Como retirar/remover/cortar zero/bytes nulos de um arquivo

Como retirar/remover/cortar zero/bytes nulos de um arquivo

Dado: um arquivo binário genérico e um tamanho de bloco

Saída desejada: uma cópia do arquivo binário onde todos os blocos que contêm apenas zero bits/bytes foram removidos/removidos do arquivo

Eu realmente me pergunto por que não consigo encontrar uma ferramenta que faça esse trabalho simples. Criei um script pequeno, mas seu desempenho é ridículo. Deve haver um software capaz de fazer isso, não é?!

Talvez o problema em descobrir isso seja causado pelo fato de haver tantos termos que podem ser usados ​​para expressar essa necessidade...

Editar: O thread sed que você menciona substitui cada byte, eu só quero substituir 0 bytes se houver pelo menos muitos blocos em uma linha.

Quero investigar um arquivo muito grande e esparso (não esparso como no arquivo esparso no sistema de arquivos) e para esta análise quero cortar partes irrelevantes

EDIT 2: O tamanho do arquivo é da ordem de 10 a 1000 GB. Para tamanhos pequenos, minha ferramenta lenta é adequada, mas para arquivos maiores...

Responder1

bbeé "um sededitor semelhante para arquivos binários". No Debian está no bbepacote.

Seria melhor se você pudesse s/^\0*$//identificar blocos cheios de bytes nulos e removê-los. Meus testes indicam que essas expressões do tipo regex não funcionam no bbe. Você ainda pode usar (quase) quantos \0precisar:

s/\0\0…\0\0//

onde denota o número certo de \0substrings. Se você escolher um tamanho de bloco grande, pode ser problemático passar uma string longa e adequada por meio da linha de comando. Felizmente, bbesuporta a leitura de um script de um arquivo. Proceda assim:

# The following function uses non-POSIX 'for' loop. Rewrite if necessary.
gen_script() {
   printf 's/'
   for ((i=0;i<"$1";i++)); do
      printf '\\0'
   done
   printf '//\n'
}

# This needs to be a plain decimal number:
blocksize=512

gen_script "$blocksize" > bbe-script
<binary_file_in bbe -b ":$blocksize" -f bbe-script >binary_file_out

Problemas:

  1. A implementação acima gen_scripté bastante lenta e pouco prática para arquivos blocksize.
  2. Em meus testes bbese comportou mal por blocksizemais de 16384(ou seja, blocos de 16 KiB). Isso torna o primeiro problema irrelevante.
  3. Neste papel bbeem si também não parece muito rápido. Não sei o tamanho do seu "arquivo muito grande". Se eu fosse você eu tentaria

    pv binary_file_in | bbe -b ":$blocksize" -f bbe-script >binary_file_out
    

    e depois de alguns segundos eu seria capaz de dizer se o ETA é aceitável.

informação relacionada