Lesen Sie über das Dateiende hinaus, um Daten wiederherzustellen

Lesen Sie über das Dateiende hinaus, um Daten wiederherzustellen

Eine sehr alte SWP-Datei hat eine Datei, die ich gerade bearbeitet habe, wiederhergestellt, sodass sie jetzt deutlich kürzer ist. Seitdem habe ich in diesem Verzeichnis nichts mehr gemacht, daher sollten die Bytes unmittelbar nach dem Dateiende noch meine Daten enthalten. Welche Funktion kann ich verwenden, um N Bytes von einer bestimmten Speicheradresse zu lesen? ddund readan Dateigrenzen anzuhalten, es sei denn, ich habe irgendwo eine Option übersehen.

Die aktuelle Dateigröße beträgt 3,2 KB. Ich weiß nicht mehr genau, wie groß die Datei vor dem Abschneiden war, aber wahrscheinlich nicht mehr als 10 KB. Wie kann ich 10 KB vom Anfang der Datei lesen und dabei Dateigrenzen ignorieren? Es ist in Ordnung, wenn die Daten nicht perfekt erhalten bleiben, solange ich nicht von vorne beginnen muss.

Antwort1

Normalerweise löschen oder kürzen Editoren Dateien beim Speichern auf 0, um so zugewiesenen Speicherplatz freizugeben, und schreiben dann, wodurch neuer Speicherplatz zugewiesen wird. Dies führt dazu, dass das Dateisystem die Daten an einem völlig anderen physischen Ort ablegt. Ihre Idee funktioniert also möglicherweise nicht.

Sie können den physischen Speicherort einer Datei mit filefragoder ermitteln hdparm --fibmapund dddiesen dann direkt mit lesen. Ich habe diesen Vorgang in einem anderen Kontext hier beschrieben:https://unix.stackexchange.com/a/85880/30851


In Ihrem Fall benötigen Sie wahrscheinlich eher den allgemeinen Ansatz zum Suchen von Textdaten, etwa:

strings -n 12 -t d /dev/partition | grep -F 'text snippet'

stringssucht nach aufeinanderfolgenden ASCII-Daten (unterstützt auch einige andere Kodierungen, bei UTF-8 bin ich mir nicht sicher. Wenn es Code oder Englisch ist, brauchen Sie es nicht) und druckt auch den Offset aus, an dem sie gefunden wurden.

text snippetsollte ein exaktes, eindeutiges Textbeispiel sein, von dem Sie wissen, dass es sich in dem gesuchten Teil der Datei befindet [in einer einzigen Zeile]. (Wenn Sie es nicht genau wissen, können Sie stattdessen mit regulären Ausdrücken greppen.)

-n 12ist die Mindestlänge, nach der stringsgesucht wird. 12sollte die Länge Ihres sein text snippet. Dieser Parameter ist optional. Wenn er angegeben wird, kann er helfen, strings | grepetwas schneller zu arbeiten.

Das Lesen der gesamten Partition dauert lange, aber wenn es erfolgreich ist, verfügen Sie über einen Offset, den Sie eingeben können, ddum den allgemeinen Bereich zu erfassen und dann Dinge zu entfernen, die nicht dazugehören.

Ich habe in diesem Verzeichnis nichts mehr gemacht, seitdem

Wenn Ihr Verzeichnis nicht zufällig ein Einhängepunkt ist, reservieren die meisten Dateisysteme nicht wirklich Speicherplatz „pro Verzeichnis“, sodass alle Schreibvorgänge im gesamten Dateisystem den gesuchten Teil überschreiben können. Bei einer Datenwiederherstellung schalten Sie das Ganze normalerweise in den Nur-Lese-Modus.

verwandte Informationen