Lesen Sie das letzte Dateiende, um Daten wiederherzustellen

12

Eine sehr alte .swp-Datei hat eine von mir bearbeitete Datei wiederhergestellt, sodass sie jetzt erheblich kürzer ist. Ich habe seitdem nichts mehr in diesem Verzeichnis getan, daher sollten die Bytes unmittelbar nach dem Ende der Datei noch meine Daten enthalten. Mit welcher Funktion kann ich N Bytes von einer bestimmten Speicheradresse lesen? ddund readhalt an dateigrenzen, es sei denn ich habe irgendwo eine option verpasst.

Die aktuelle Dateigröße beträgt 3.2 KB. Ich erinnere mich nicht genau, wie groß die Datei war, bevor sie abgeschnitten wurde, aber wahrscheinlich nicht mehr als 10 KB. Wie kann ich 10 KB ab dem Dateianfang lesen und dabei die Dateigrenzen ignorieren? Es ist in Ordnung, wenn die Daten nicht perfekt erhalten bleiben, solange ich nicht von vorne anfangen muss.

Matthew Bedford
quelle

Antworten:

18

Wenn Editoren Dateien speichern, löschen oder kürzen sie normalerweise auf 0, wodurch zugewiesener Speicherplatz freigegeben wird, und schreiben dann, wodurch neuer Speicherplatz zugewiesen wird. Dies führt dazu, dass das Dateisystem die Daten an einem völlig anderen physikalischen Ort ablegt. Ihre Idee könnte also nicht funktionieren.

Sie können den physischen Speicherort einer Datei mit filefragoder hdparm --fibmapabrufen und dann verwenden dd, um diesen physischen Speicherort direkt zu lesen. Ich habe diesen Prozess hier in einem anderen Kontext beschrieben: /unix//a/85880/30851


In Ihrem Fall ist es wahrscheinlicher, dass Sie den allgemeinen Ansatz zum Auffinden von Textdaten benötigen ... so etwas wie:

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

strings sucht nach aufeinanderfolgenden ASCII-Daten (unterstützt auch einige andere Codierungen, nicht sicher in Bezug auf UTF-8. Wenn es sich um Code oder Englisch handelt, wird es nicht benötigt) und druckt auch den Offset, an dem es gefunden wurde.

text snippetsollte ein genaues, eindeutiges Textbeispiel sein, an das Sie sich erinnern, dass es sich in dem Teil der Datei befindet, nach dem Sie suchen [in einer einzigen Zeile]. (Wenn Sie es nicht genau wissen, können Sie stattdessen reguläre Ausdrücke verwenden.)

-n 12ist die Mindestlänge, stringsnach der gesucht wird. 12sollte die Länge deines sein text snippet. Dieser Parameter ist optional, sofern dies möglich ist strings | grep.

Das Lesen der gesamten Partition dddauert sehr lange. Wenn dies jedoch erfolgreich ist, können Sie einen Offset angeben , um den allgemeinen Bereich zu erfassen und dann nicht zugehörige Elemente zu entfernen.

Ich habe seitdem nichts mehr in diesem Verzeichnis gemacht

Wenn Ihr Verzeichnis kein Einhängepunkt ist ... reservieren die meisten Dateisysteme nicht wirklich Speicherplatz "pro Verzeichnis", so ... dass alle Schreibvorgänge im gesamten Dateisystem möglicherweise das gesuchte Bit überschreiben. In einer Datenwiederherstellungssituation schalten Sie normalerweise das gesamte Objekt in den Nur-Lese-Modus.

Frostschutz
quelle
Beachten Sie, dass jede Datei in vielen Blöcken gespeichert ist und normalerweise nicht nacheinander gespeichert wird. So stringswerden nur einige Teile der Datei gefunden, es sei denn, Sie haben großes Glück.
Gilles 'SO- hör auf böse zu sein'
3
Im Gegenteil, Sie müssten extrem viel Pech haben, um eine fragmentierte 10-KB-Datei zu finden. Wenn Sie nur ein Teil finden, ist es in diesem Fall wahrscheinlicher, dass das andere Teil überschrieben wurde. Wenn Sie in diesem Dateisystem jedoch nicht viel Schreibaktivität haben oder es sich um eine SSD mit sofortiger Löschung handelt, werden Sie möglicherweise viele Kopien dieser Datei finden, wenn Sie diese Datei während der Bearbeitung mehrmals gespeichert haben.
Frostschutz
3
Ich würde eine strings -n16vernünftige Mindestlänge empfehlen , damit es schneller geht.
Peter Cordes
Guter Punkt, fügte es der Antwort hinzu.
Frostschutz
4
Vielen Dank. Es gab nur Müll kurz nach dem Ende der Datei, aber mit konnte stringsich die gesamte Datei an anderer Stelle in der Partition finden. Das sind fast zwei Monate Arbeit, die ich nicht mehr erledigen muss, und eine hervorragende Erinnerung, um immer die Versionskontrolle für alles Wichtige zu verwenden.
Matthew Bedford