Antworten:
Warum gibt der zweite Befehl einen anderen Wert aus?
Wird aus historischen Gründen dd
als x
Multiplikationsoperator betrachtet. Wird 0x3
also mit 0 bewertet.
Ist es möglich, den Offset "Überspringen | Suchen" als Hexadezimalwert an dd zu übergeben?
Soweit ich weiß nicht direkt. Neben der Multiplikation mit dem Operator x
können Sie eine beliebige Zahl mit b
dem Zusatz "Multiplizieren mit 512" (0x200) und mit K
"Multiplizieren mit 1024" (0x400) versehen. Mit GNU dd können Sie auch Suffixe verwenden M
, G
, T
, P
, E
, Z
und Y
durch 2 hoch 20 multiplizieren bedeuten, 30, 40, 50, 60, 70, 80 oder 90 sind, und man kann obere oder Kleinbuchstaben verwenden , außer für das b
Suffix. (Es gibt viele andere mögliche Suffixe. Bedeutet beispielsweise EB
"Multiplizieren mit 10 18 " und PiB
"Multiplizieren mit 2 50 ". info coreutils "block size"
Weitere Informationen finden Sie, wenn Sie eine GNU-Installation haben.)
Vielleicht finden Sie das oben Genannte arkan, anachronistisch und geekig bis zur Absurdität. Keine Sorge: Sie sind nicht allein. Glücklicherweise können Sie einfach alles ignorieren und stattdessen die arithmetische Substitution Ihrer Shell verwenden (Bash- und andere Posix-kompatible Shells funktionieren ebenso wie einige Nicht-Posix-Shells). Die Shell versteht Hexadezimalzahlen und ermöglicht eine ganze Reihe von arithmetischen Operatoren, die auf normale Weise geschrieben wurden. Sie müssen den Ausdruck nur umgeben mit $((...))
:
# dd if=2013-Aug-uptime.csv bs=1 count=$((0x2B * 1024)) skip=$((0x37))
$((...))
ändert nichts. Der einzige Fall, in dem ich mir vorstellen kann, wo Zitate irgendetwas IFS=4
bewirken würden, wäre, wenn Sie so etwas hätten, aber das würde alle möglichen anderen Chaos verursachen.
$((...))
. POSIX ist klar, dass die Erweiterung von der Wortaufteilung $((...))
unterliegt . Der Operator split + glob lässt keine der Erweiterungen für Befehle / Arithmetik / Variablen im Listenkontext ohne Anführungszeichen. Das Setzen von IFS = 4 würde nicht alle möglichen Probleme verursachen, wenn Sie den Split + Glob-Operator nicht dort verwenden, wo er nicht benötigt / gewünscht wird, und IFS jedes Mal setzen, wenn Sie diesen Split + Glob-Operator benötigen.
IFS
etwas einstellen , das Ziffern enthält, etwas, von dem ich nicht glaube, dass ich es jemals getan habe, müssen Sie zitieren. Wenn man das tun würde, wäre man sich vermutlich der Notwendigkeit bewusst, da es kaum etwas ist, was man wahrscheinlich beiläufig tun wird. Zumindest ist es kaum etwas, was ich wahrscheinlich tun werde, Punkt. Ich will nicht für dich sprechen.
Ich weiß, dass dies ein alter Thread ist, aber das Problem ist immer noch so aktuell wie immer, besonders wenn Idioten wie ich versehentlich eine 'cp fileA fileB' aus dem Bash-Verlauf abrufen und auslösen, wenn fileB noch nicht eingecheckt ist, um nicht gesichert zu werden nach oben und enthält mehrere Stunden Codierung nach einer Nacht: - /
Dank der Konzepte in diesem Thread konnte ich meine verlorene Datei vollständig wiederherstellen, verlor jedoch meine auf einem virtuellen Virtual Private-Server mit einer 32-GB-Festplatte und sehr wenig RAM (unter Ubuntu 18.04) und alle meine Versuche mit 'grep' as oben würde schnell mit "unzureichendem Speicher" sterben
In meinem Fall war es das, hexdump -C /dev/sdX1 | grep 'shortString'
was mir zu Hilfe kam. Im Gegensatz zu grep wird nur eine sehr knappe ASCII-Darstellung des Hex angezeigt. Daher ist es wichtig, nur nach einer kurzen, eindeutigen Zeichenfolge zu suchen und zu berücksichtigen, dass auch diese umbrochen werden kann. Nachdem es eine Hex-Adresse ausgegeben hatte, bei der eine Übereinstimmung bestand, konnte ich 'dd' auf ähnliche Weise wie oben verwenden, außer dass ich feststellte, dass es standardmäßig eine Blockgröße von 4096 hatte, also musste ich nicht nur konvertieren sie die hex - Adresse in dezimalem Bytes aber teilen sie durch 4096 es zu 4k Blöcken für DDs Parameter skip maßstab - wenig hilfreich, wenn diese Zahl für dd der Fehlermeldung sieht zu groß ist , wie es etwa beschwert skip=
eher ungültig ist als die Anzahl an sie übergab .
$((0xabcd))
Ein großes Lob an die Leute, die Tipps zur Verwendung von Bash hinzugefügt haben, um die Hex-> Dec-Konvertierung zu vereinfachen :-)
Nur mein letztes Wort - In meinem Fall gab es mehrere Kopien derselben Datei, die sich alle in unmittelbarer Nähe befanden. Aber indem ich die niedrigste Adresse von der höchsten von hexdump gemeldeten Adresse subtrahierte, konnte ich eine ~ 5-MB-Region identifizieren, die alle möglichen Kopien enthielt, was bedeutete, dass ich dd auf die niedrigste Adresse ausrichten und diese gesamte Region in eine temporäre Datei extrahieren konnte. Der Vim-Editor verarbeitet Binärinhalte jetzt recht elegant, sodass Sie das Tempfile untersuchen und nach Bedarf umformen können.
$((...))
es sich um eine arithmetische POSIX-Erweiterung handelt. Sie ist überhaupt nicht bash-spezifisch. Sie müssen sie nicht verwendenbash
, um sie zu verwenden. Jede POSIX-Shell reicht aus. Beachten Sie jedoch, dass in vielen Shells, einschließlichbash
, eine Wortaufteilung durchgeführt wird, daher sollte zitiert werden.