データの回復のためにファイルの終わりを超えて読み取る

データの回復のためにファイルの終わりを超えて読み取る

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

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

答え1

通常、エディターがファイルを保存するときは、削除または 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大まかな領域を取得し、不要なものを削除できるようになります。

それ以来そのディレクトリでは何もしていない

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

関連情報