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 sed
editor semelhante para arquivos binários". No Debian está no bbe
pacote.
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 \0
precisar:
s/\0\0…\0\0//
onde …
denota o número certo de \0
substrings. 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, bbe
suporta 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:
- A implementação acima
gen_script
é bastante lenta e pouco prática para arquivosblocksize
. - Em meus testes
bbe
se comportou mal porblocksize
mais de16384
(ou seja, blocos de 16 KiB). Isso torna o primeiro problema irrelevante. Neste papel
bbe
em si também não parece muito rápido. Não sei o tamanho do seu "arquivo muito grande". Se eu fosse você eu tentariapv 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.