Dado: un archivo binario genérico y un tamaño de bloque
Resultado deseado: una copia del archivo binario donde todos los bloques que contienen solo cero bits/bytes se han eliminado/eliminado del archivo
Realmente me pregunto por qué no puedo encontrar una herramienta que haga este sencillo trabajo. Creé un pequeño guión, pero su ejecución es ridícula. Debe haber un software existente capaz de hacer esto, ¿no es así?
Quizás el problema para encontrar esto se debe al hecho de que hay tantos términos que pueden usarse para expresar esta necesidad...
Editar: el hilo sed que mencionas reemplaza cada byte, solo quiero reemplazar 0 bytes si hay al menos muchos de tamaño de bloque seguidos.
Quiero investigar un archivo muy grande y muy disperso (no disperso como en un archivo disperso en el sistema de archivos) y para este análisis quiero cortar partes irrelevantes.
EDITAR 2: El tamaño del archivo es del orden de 10 a 1000 GB. Para tamaños pequeños, mi propia herramienta lenta está bien, pero para archivos tan grandes...
Respuesta1
bbe
es "un sed
editor similar para archivos binarios". En Debian está en el bbe
paquete.
Sería mejor si pudiera s/^\0*$//
identificar bloques llenos de bytes nulos y eliminarlos. Mis pruebas indican que este tipo de expresiones similares a expresiones regulares no funcionan en bbe
. Aún puedes usar (casi) tantos \0
como necesites:
s/\0\0…\0\0//
donde …
denota el número correcto de \0
subcadenas. Si elige un tamaño de bloque grande, puede resultar problemático pasar una cadena tan larga a través de la línea de comando. Afortunadamente bbe
admite la lectura de un script desde un archivo. Proceda así:
# 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:
- La implementación anterior de
gen_script
es bastante lenta y poco práctica para aplicaciones de gran tamañoblocksize
. - En mis pruebas
bbe
se portó mal duranteblocksize
más de16384
(es decir, bloques de 16 KiB). Esto hace que el primer problema sea irrelevante. En este papel
bbe
tampoco parece muy rápido. No sé qué tan grande es su "archivo muy grande". Si yo fuera tú lo intentaríapv binary_file_in | bbe -b ":$blocksize" -f bbe-script >binary_file_out
y después de unos segundos podría decir si ETA es aceptable.