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
bbe
ist „ein sed
-ähnlicher Editor für Binärdateien“. In Debian ist er im bbe
Paket 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, \0
wie Sie benötigen:
s/\0\0…\0\0//
wobei …
die richtige Anzahl der \0
Teilstrings bezeichnet. Wenn Sie große Blockgrößen wählen, kann es problematisch sein, einen entsprechend langen String über die Kommandozeile zu übergeben. Glücklicherweise bbe
unterstü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:
- The above implementation of
gen_script
is pretty slow, rather impractical for largeblocksize
. - In my tests
bbe
misbehaved forblocksize
greater than16384
(i.e. blocks of 16 KiB). This makes the first problem irrelevant. 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 trypv 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.