La risposta è "Probabilmente sì, ma dipende dal tipo di filesystem e dai tempi".
Nessuno di questi tre esempi sovrascriverà i blocchi di dati fisici di file_vecchio o file_esistente, se non per caso.
mv new_file old_file
. Questo scollegherà old_file. Se sono presenti ulteriori collegamenti fisici a old_file, i blocchi rimarranno invariati nei collegamenti rimanenti. Altrimenti, i blocchi saranno generalmente (dipende dal tipo di filesystem) inseriti in un elenco libero. Quindi, se ciò mv
richiede la copia (invece di spostare semplicemente le voci della directory), i nuovi blocchi verranno allocati come mv
scritture.
Questi blocchi appena allocati possono essere o meno gli stessi che sono stati appena liberati . Su filesystem come UFS , i blocchi sono allocati, se possibile, dallo stesso gruppo di cilindri della directory in cui è stato creato il file. Quindi c'è una possibilità che scollegare un file da una directory e creare un file in quella stessa directory riutilizzerà ( e sovrascrivere) alcuni degli stessi blocchi che sono stati appena liberati. Questo è il motivo per cui il consiglio standard alle persone che rimuovono accidentalmente un file è di non scrivere nuovi dati nei file nella loro struttura di directory (e preferibilmente non nell'intero filesystem) fino a quando qualcuno non può tentare il recupero dei file.
cp new_file old_file
farà quanto segue (è possibile utilizzare strace
per vedere le chiamate di sistema):
open ("old_file", O_WRONLY | O_TRUNC) = 4
Il flag O_TRUNC causerà la liberazione di tutti i blocchi di dati, proprio come mv
sopra. E come sopra, verranno generalmente aggiunti a un elenco gratuito e potrebbero o meno essere riutilizzati dalle successive scritture eseguite dal cp
comando.
vi existing_file
. In caso vi
affermativo vim
, il :x
comando procede come segue:
unlink ("isting_file ~ ") = -1 ENOENT (nessun file o directory)
rinomina ("isting_file ", "isting_file ~") = 0
aperto ("isting_file ", O_WRONLY | O_CREAT | O_TRUNC, 0664) = 3
Quindi non rimuove nemmeno i vecchi dati; i dati sono conservati in un file di backup.
Su FreeBSD, lo vi
fa open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
, che avrà la stessa semantica di cui cp
sopra.
È possibile recuperare alcuni o tutti i dati senza programmi speciali; tutto ciò che serve è grep
e dd
, e l'accesso al dispositivo raw.
Per file di testo di piccole dimensioni, il modo più semplice è il singolo grep
comando nella risposta di @Steven D alla domanda a cui sei collegato:
grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
Ma per file più grandi che possono trovarsi in più blocchi non contigui, faccio questo:
grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file
che ti darà l'offset in byte della linea corrispondente. Seguilo con una serie di dd
comandi, a partire da
dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
Dovresti anche leggere alcuni blocchi prima e dopo quel blocco. Su UFS, i blocchi di file sono in genere 8 KB e vengono allocati in modo abbastanza contiguo, i blocchi di un singolo file vengono alternati alternativamente con blocchi di 8 KB da altri file o spazio libero. La coda di un file su UFS è composta da un massimo di 7 frammenti da 1 KB, che possono essere o meno contigui.
Ovviamente, sui file system che comprimono o crittografano i dati, il ripristino potrebbe non essere così semplice.
Esistono pochissime utility in Unix che sovrascriveranno i blocchi di dati di un file esistente. Uno che viene in mente è dd conv=notrunc
. Un altro è shred
.