ファイルの過去の終わりを読み取ってデータを回復する


12

非常に古い.swpファイルは、編集していたファイルを元に戻したため、大幅に短くなりました。それ以来、私はそのディレクトリで何もしていないので、ファイルの終わりの直後のバイトにはまだデータがあるはずです。特定のメモリアドレスからNバイトを読み取るためにどの関数を使用できますか?ddそして、read私はオプションのどこかを逃していない限り、ファイルの境界で停止します。

現在のファイルサイズは3.2 KBです。切り捨てられる前のファイルの大きさを正確には覚えていませんが、おそらく10 KB以下です。ファイルの境界を無視して、ファイルの先頭から10 KBを読み取るにはどうすればよいですか?最初から始める必要がない限り、データが完全に保存されていなくても問題ありません。

回答:


18

通常、エディターはファイルを保存するときに、削除するか0に切り捨てて、割り当てられたスペースを解放してから書き込み、新しいスペースを割り当てます。これにより、ファイルシステムはデータを完全に異なる物理的な場所に配置します。したがって、あなたのアイデアはうまくいかないかもしれません。

filefragまたはを使用してファイルの物理的な場所を取得し、その物理的な場所を直接読み取るhdparm --fibmapために使用ddできます。ここで別のコンテキストでこのプロセスを説明しました:https : //unix.stackexchange.com/a/85880/30851


あなたの場合、テキストデータを見つけるための一般的なアプローチが必要になる可能性が高くなります...

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

strings 連続したASCIIデータを検索し(他のエンコーディングもサポートしますが、UTF-8については不明です。コードまたは英語の場合は必要ありません)、見つかったオフセットも出力します。

text snippet探しているファイルの一部にあることを覚えている、正確で一意のテキストサンプルでなければなりません(1行で)。(正確にわからない場合は、代わりに正規表現でgrepを実行できます。)

-n 12strings探す最小の長さです。12の長さである必要がありますtext snippet。このパラメーターはオプションですが、提供されている場合はstrings | grep、少し速くするのに役立ちます。

パーティション全体を読み込むには長い時間がかかりますが、成功した場合ddは、一般的な領域を取得し、属していないものを削除するためにフィードできるオフセットがあります。

私はそのディレクトリで何もしていません

ディレクトリがマウントポイントにならない場合...ほとんどのファイルシステムは「ディレクトリごとに」スペースを実際に予約しないので...ファイルシステム全体のすべての書き込みが探しているビットを上書きする可能性があります。データ回復の状況では、通常、すべてを読み取り専用モードに切り替えます。


各ファイルは多くのブロックに保存され、通常は連続して保存されないことに注意してください。したがってstrings、非常に幸運でない限り、ファイルの一部のみを検索します。
ジル 'SO-悪であるのをやめる'

3
まったく逆に、断片化された10 KBファイルを見つけるには、非常に不運でなければなりません。部品のみが見つかった場合、この場合、他の部品が上書きされた可能性が高くなります。ただし、そのファイルシステムで大量の書き込みアクティビティがある場合、またはインスタント破棄を使用するSSDでない限り、編集中にそのファイルを複数回保存すると、そのファイルのコピーが多数見つかる可能性があります。
frostschutz

3
strings -n16それを速くするために、いくつかの合理的な最小長を推奨します。
ピーターコーデス

良い点は、答えに追加しました。
frostschutz

4
本当にありがとう。ファイルの終わりを過ぎたところにごみしかありませstringsんでしたが、パーティション内の他の場所にあるファイル全体を見つけることができました。それは私がやり直す必要がないほぼ2か月の作業であり、重要なことには常にバージョン管理を使用することを忘れないでください。
マシューベッドフォード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.