Die Antwort lautet "Wahrscheinlich ja, aber es hängt vom Dateisystemtyp und dem Timing ab."
Keines dieser drei Beispiele überschreibt die physischen Datenblöcke von old_file oder existing_file, außer durch Zufall.
mv new_file old_file
. Dadurch wird die Verknüpfung von old_file aufgehoben. Wenn es zusätzliche feste Links zu old_file gibt, bleiben die Blöcke in diesen verbleibenden Links unverändert. Andernfalls werden die Blöcke in der Regel (abhängig vom Dateisystemtyp) auf eine freie Liste gesetzt. Wenn dann das mv
Kopieren erforderlich ist (im Gegensatz zum Verschieben von Verzeichniseinträgen), werden neue Blöcke beim mv
Schreiben zugewiesen .
Diese neu zugewiesenen Blöcke können dieselben sein, die gerade freigegeben wurden, oder auch nicht . Bei Dateisystemen wie UFS werden Blöcke nach Möglichkeit aus derselben Zylindergruppe wie das Verzeichnis zugewiesen, in dem die Datei erstellt wurde. Daher besteht die Möglichkeit, dass das Aufheben der Verknüpfung einer Datei mit einem Verzeichnis und das Erstellen einer Datei in demselben Verzeichnis wiederverwendet werden ( und überschreiben) einige der Blöcke, die gerade freigegeben wurden. Aus diesem Grund wird Personen, die versehentlich eine Datei entfernen, standardmäßig empfohlen, keine neuen Daten in die Dateien in ihrem Verzeichnisbaum (und vorzugsweise nicht in das gesamte Dateisystem) zu schreiben, bis jemand versuchen kann, die Datei wiederherzustellen.
cp new_file old_file
wird das Folgende tun (Sie können verwenden strace
, um die Systemaufrufe zu sehen):
open ("old_file", O_WRONLY | O_TRUNC) = 4
Das O_TRUNC-Flag bewirkt, dass alle Datenblöcke freigegeben werden, genau wie mv
oben. Und wie oben, werden sie im Allgemeinen zu einer freien Liste hinzugefügt und können durch die nachfolgenden Schreibvorgänge, die vom cp
Befehl ausgeführt werden , wiederverwendet werden oder nicht .
vi existing_file
. Wenn dies vi
tatsächlich vim
der :x
Fall ist , führt der Befehl Folgendes aus:
unlink ("existing_file ~") = -1 ENOENT (Keine solche Datei oder kein solches Verzeichnis)
rename ("existing_file", "existing_file ~") = 0
open ("existing_file", O_WRONLY | O_CREAT | O_TRUNC, 0664) = 3
Es werden also nicht einmal die alten Daten entfernt. Die Daten werden in einer Sicherungsdatei gespeichert.
Unter FreeBSD hat vi
dies open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
die gleiche Semantik wie cp
oben.
Sie können einige oder alle Daten ohne spezielle Programme wiederherstellen. Alles, was Sie brauchen, ist grep
und dd
und Zugriff auf das Raw-Gerät.
Für kleine Textdateien ist der einzige grep
Befehl in der Antwort von @Steven D in der Frage, mit der Sie verknüpft sind, der einfachste Weg:
grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
Bei größeren Dateien, die sich möglicherweise in mehreren nicht zusammenhängenden Blöcken befinden, gehe ich folgendermaßen vor:
grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file
Dies gibt Ihnen den Versatz in Bytes der übereinstimmenden Zeile. Folgen Sie dieser mit einer Reihe von dd
Befehlen, beginnend mit
dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
Sie möchten auch einige Blöcke vor und nach diesem Block lesen. Unter UFS sind Dateiblöcke normalerweise 8 KB groß und werden normalerweise ziemlich zusammenhängend zugewiesen, wobei die Blöcke einer einzelnen Datei abwechselnd mit 8 KB-Blöcken aus anderen Dateien oder freiem Speicherplatz verschachtelt werden. Das Ende einer Datei in UFS besteht aus bis zu 7 1-KB-Fragmenten, die möglicherweise zusammenhängend sind oder nicht.
Auf Dateisystemen, die Daten komprimieren oder verschlüsseln, ist die Wiederherstellung möglicherweise nicht so einfach.
Tatsächlich gibt es in Unix nur sehr wenige Dienstprogramme, die die Datenblöcke einer vorhandenen Datei überschreiben. Eine, die mir einfällt, ist dd conv=notrunc
. Ein anderer ist shred
.