非常に古い .swp ファイルによって、編集中のファイルが元に戻されたため、ファイルが大幅に短くなりました。それ以降、そのディレクトリでは何もしていないため、ファイルの末尾の直後のバイトにはまだデータがあるはずです。特定のメモリ アドレスから N バイトを読み取り、ファイルの境界で停止するにdd
はread
、どの関数を使用すればよいでしょうか。どこかでオプションを見逃していない限りは。
現在のファイル サイズは 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 12
strings
は、検索する最小の長さです。12
の長さにする必要があります。このパラメータはオプションです。指定すると、少し高速化されるtext snippet
可能性があります。strings | grep
パーティション全体を読み取るのに長い時間がかかりますが、成功すると、オフセットを取得してdd
大まかな領域を取得し、不要なものを削除できるようになります。
それ以来そのディレクトリでは何もしていない
ディレクトリがマウントポイントでない場合、ほとんどのファイルシステムは実際には「ディレクトリごとに」スペースを予約しないので、ファイルシステム全体へのすべての書き込みによって、探しているビットが上書きされる可能性があります。データ復旧の状況では、通常、全体を読み取り専用モードに切り替えます。