How to strip/remove/cut Zero/Null-Bytes off a file

How to strip/remove/cut Zero/Null-Bytes off a file

Gegeben: Eine generische Binärdatei und eine Blockgröße

Gewünschte Ausgabe: Eine Kopie der Binärdatei, aus der alle Blöcke, die nur Null-Bits/Bytes enthalten, entfernt/entfernt wurden

Ich frage mich wirklich, warum ich kein Tool finde, das diese einfache Aufgabe erledigt. Ich habe ein kleines Skript erstellt, aber seine Leistung ist lächerlich. Es muss doch eine vorhandene Software geben, die das kann, oder nicht?!

Vielleicht liegt das Problem bei der Suche danach darin, dass es so viele Begriffe gibt, mit denen dieser Bedarf ausgedrückt werden kann …

Bearbeiten: Der von Ihnen erwähnte Sed-Thread ersetzt jedes Byte. Ich möchte nur 0-Bytes ersetzen, wenn mindestens viele davon in einer Reihe vorhanden sind.

Ich möchte eine sehr große, sehr spärliche Datei untersuchen (nicht spärlich im Sinne einer spärlichen Datei im Dateisystem) und für diese Analyse möchte ich irrelevante Teile ausschneiden

EDIT 2: Die Dateigröße liegt im Bereich von 10 bis 1000 GB. Für kleine Größen ist mein langsames eigenes Tool in Ordnung, aber für so größere Dateien ...

Antwort1

bbeist „ein sed-ähnlicher Editor für Binärdateien“. In Debian ist er im bbePaket enthalten.

Am besten wäre es, wenn Sie s/^\0*$//Blöcke voller Nullbytes identifizieren und entfernen könnten. Meine Tests zeigen, dass solche Regex-ähnlichen Ausdrücke in nicht funktionieren bbe. Sie können immer noch (fast) so viele verwenden, \0wie Sie benötigen:

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

wobei die richtige Anzahl der \0Teilstrings bezeichnet. Wenn Sie große Blockgrößen wählen, kann es problematisch sein, einen entsprechend langen String über die Kommandozeile zu übergeben. Glücklicherweise bbeunterstützt ein Skript das Lesen aus einer Datei. Gehen Sie dazu wie folgt vor:

# 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

Symptome:

  1. The above implementation of gen_script is pretty slow, rather impractical for large blocksize.
  2. In my tests bbe misbehaved for blocksize greater than 16384 (i.e. blocks of 16 KiB). This makes the first problem irrelevant.
  3. In this role bbe itself seems not very fast either. I don't know how large your "very large file" is. If I were you I would try

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

    and after few seconds I would be able to tell if ETA is acceptable.

verwandte Informationen