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ò mvrichiede la copia (invece di spostare semplicemente le voci della directory), i nuovi blocchi verranno allocati come mvscritture.
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_filefarà quanto segue (è possibile utilizzare straceper 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 mvsopra. E come sopra, verranno generalmente aggiunti a un elenco gratuito e potrebbero o meno essere riutilizzati dalle successive scritture eseguite dal cpcomando.
vi existing_file. In caso viaffermativo vim, il :xcomando 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 vifa open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664), che avrà la stessa semantica di cui cpsopra.
È possibile recuperare alcuni o tutti i dati senza programmi speciali; tutto ciò che serve è grepe dd, e l'accesso al dispositivo raw.
Per file di testo di piccole dimensioni, il modo più semplice è il singolo grepcomando 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 ddcomandi, 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.