ベストアンサー1
答えは「おそらくそうですが、ファイルシステムの種類と時間によって異なります」です。
間違いを除いて、これら3つの例のいずれもold_fileまたはexecution_fileの物理データブロックを上書きしません。
mv new_file old_file
。これにより、old_fileの接続が解除されます。 old_fileへの他のハードリンクがある場合、残りのリンクのブロックは変更されていません。そうでない場合、これらのブロックは通常(ファイルシステムのタイプに応じて)使用可能リストに配置されます。その後、コピーが必要な場合mv
(ディレクトリエントリを移動するのではなく)、新しいブロックが書き込みmv
として割り当てられます。新しく割り当てられたブロック公開されたばかりのものと同じでも異なる場合もあります。。このようなファイルシステムでは超高速ファイルシステム、可能であれば、ファイルが作成されたディレクトリと同じシリンダーグループのブロックを割り当てます。そのため、ディレクトリからファイルのリンクを解除して同じディレクトリにファイルを作成すると、解放されたばかりの同じブロックの一部を再利用(および上書き)する可能性があります。これは、誤ってファイルを削除した人のための標準的なアドバイスが、誰かがファイルを回復しようとするまでディレクトリツリーのファイルに新しいデータを書き込まないようにすることです(ファイルシステム全体に書き込まないことをお勧めします)。
cp new_file old_file
次の手順を実行します(これを使用してstrace
システムコールを表示できます)。開く(「古いファイル」、O_WRONLY | O_TRUNC)= 4
mv
O_TRUNCフラグは、上記と同様にすべてのデータブロックを解放します。上記のように、通常は利用可能なリストに追加され、コマンドの完了時に後続の書き込みで再利用される場合とそうでない場合がありますcp
。vi existing_file
。vi
もしそうなら、コマンドvim
は:x
次のことを行います。unlink("existing_file~") = -1 ENOENT (該当するファイルやディレクトリなし)
rename("既存ファイル", "既存ファイル~") = 0
open("既存ファイル", O_WRONLY | O_CREAT | O_TRUNC, 0664) = 3
したがって、既存のデータは削除されず、バックアップファイルに保存されます。
FreeBSDでは、
vi
yesはopen("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
上記と同じ意味を持ちますcp
。
データの一部または全部を回復するために特別な手順は必要ありません。必要なのは、元のデバイスにアクセスするgrep
だけです。dd
小さなテキストファイルの場合grep
、@Steven Dの答えあなたがリンクした質問の最も簡単な方法は次のとおりです。
grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
ただし、複数の連続していないチャンクに存在する可能性があるより大きなファイルの場合は、次のようにします。
grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file
これにより、一致する行のオフセット(バイト)が提供されます。次dd
から始めて、一連のコマンドを実行します。
dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
また、このブロックの前後の一部のブロックを読みたいです。 UFSでは、ファイルブロックは通常8KBであり、通常、個々のファイルのブロックは他のファイルまたは利用可能なスペースの8KBブロックとインターリーブされ、かなり連続的に割り当てられます。 UFSのファイルの末尾には最大7つの1 KBの断片があり、これらの断片は連続的でもそうでない場合もあります。
もちろん、データを圧縮または暗号化するファイルシステムでは、回復はそれほど単純ではないかもしれません。
実際、Unixには既存のファイルブロックを上書きするユーティリティはほとんどありません。思い浮かぶのはですdd conv=notrunc
。もう一つはですshred
。