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? dd
und read
an 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 filefrag
oder ermitteln hdparm --fibmap
und dd
diesen 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'
strings
sucht 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 snippet
sollte 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 12
ist die Mindestlänge, nach der strings
gesucht wird. 12
sollte die Länge Ihres sein text snippet
. Dieser Parameter ist optional. Wenn er angegeben wird, kann er helfen, strings | grep
etwas 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, dd
um 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.