Cómo quitar/eliminar/cortar cero/bytes nulos de un archivo

Cómo quitar/eliminar/cortar cero/bytes nulos de un archivo

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

bbees "un sededitor similar para archivos binarios". En Debian está en el bbepaquete.

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 \0como necesites:

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

donde denota el número correcto de \0subcadenas. 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 bbeadmite 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:

  1. La implementación anterior de gen_scriptes bastante lenta y poco práctica para aplicaciones de gran tamaño blocksize.
  2. En mis pruebas bbese portó mal durante blocksizemás de 16384(es decir, bloques de 16 KiB). Esto hace que el primer problema sea irrelevante.
  3. En este papel bbetampoco parece muy rápido. No sé qué tan grande es su "archivo muy grande". Si yo fuera tú lo intentaría

    pv 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.

información relacionada