Ich habe eine Datei, die am Anfang und Ende Müll (binäre Kopf- und Fußzeilen) enthält. Ich würde gerne wissen, wie ich diese Bytes löschen kann. Nehmen wir als Beispiel 25 Bytes vom Anfang an. Und 2 Bytes vom Ende.
Ich weiß, dass ich Truncate und DD verwenden kann, aber Truncate funktioniert nicht mit einem Stream und es scheint etwas umständlich, zwei Befehle auf der Festplatte auszuführen. Es wäre besser, wenn man truncate
, da man weiß, wie groß die Datei ist, die Datei caten könnte dd
. Oder wenn es eine bessere Möglichkeit gäbe, dies zu tun?
Antwort1
Antwort2
dderledigt beides mit einem einzigen Befehl für Sie. Stellen Sie die Blockgröße auf 1 Byte ein, überspringen Sie die ersten 25 Bytes und zählen Sie bis zur Dateigröße abzüglich der übersprungenen und Endbytes.
100 byte file
file.img
dd if=./file.img of=./trimed_file.img bs=1 skip=25 count=73
Überprüfen Sie die Zahlen doppelt, da sie möglicherweise bei 0 beginnen.
Antwort3
Mit ksh93:
{ head -c "$n"; } < file <#((n = EOF - 25 - 2 , 25))
Oder um es direkt vor Ort zu tun:
{ head -c "$n"; } < file <#((n = EOF - 25 - 2 , 25)) 1<>; file
Wenn Sie /opt/ast/bin
vor Ihrem haben $PATH
, erhalten Sie das head
integrierte.
<#((...))
ist einlseek()
Operator....
wird als arithmetischer Ausdruck interpretiert, wobeiEOF
die Länge der Datei ist. Oben weisen wir also die Länge des anzuzeigenden Teils$n
25 Bytes innerhalb der Datei zu und suchen danach.<>;
ist ein Umleitungsoperator zum Öffnen im Lese- und Schreibmodus und Abschneiden, wenn der Befehl erfolgreich ist.