La réponse est "Probablement oui, mais cela dépend du type de système de fichiers et du moment."
Aucun de ces trois exemples n'écrase les blocs de données physiques de old_file ou existing_file, sauf par hasard.
mv new_file old_file
. Cela dissociera old_file. S'il existe des liens physiques supplémentaires vers old_file, les blocs resteront inchangés dans ces liens restants. Sinon, les blocs seront généralement (cela dépend du type de système de fichiers) placés sur une liste libre. Ensuite, si la mv
copie doit être copiée (par opposition à un simple déplacement des entrées du répertoire), de nouveaux blocs seront attribués en mv
écriture.
Ces blocs nouvellement alloués peuvent être ou ne pas être les mêmes que ceux qui viennent d'être libérés . Sur les systèmes de fichiers comme UFS , les blocs sont alloués, si possible, du même groupe de cylindres que le répertoire dans lequel le fichier a été créé. Il est donc possible que la dissociation d’un fichier d’un répertoire et la création d’un fichier dans ce même répertoire soient réutilisées ( et écraser) certains des mêmes blocs qui viennent d'être libérés. C'est pourquoi le conseil standard aux personnes qui suppriment accidentellement un fichier est de ne pas écrire de nouvelles données dans les fichiers de leur arborescence de répertoires (et de préférence pas dans le système de fichiers complet) jusqu'à ce que quelqu'un puisse tenter de récupérer le fichier.
cp new_file old_file
fera ce qui suit (vous pouvez utiliser strace
pour voir les appels système):
open ("ancien_fichier", O_WRONLY | O_TRUNC) = 4
L'indicateur O_TRUNC entraînera la libération de tous les blocs de données, comme mv
précédemment. Et comme ci-dessus, ils seront généralement ajoutés à une liste libre et pourront ou non être réutilisés lors des écritures ultérieures effectuées par la cp
commande.
vi existing_file
. Si vi
c'est réellement vim
, la :x
commande fait ce qui suit:
unlink ("existing_file ~") = -1 ENOENT (aucun fichier ou répertoire de ce type)
renommer ("fichier_existant", "fichier_existant ~") = 0
open ("fichier_existant", O_WRONLY | O_CREAT | O_TRUNC, 0664) = 3
Donc, il ne supprime même pas les anciennes données; les données sont conservées dans un fichier de sauvegarde.
Sous FreeBSD, vi
do open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
, qui aura la même sémantique que cp
ci-dessus.
Vous pouvez récupérer tout ou partie des données sans programmes spéciaux; tout ce dont vous avez besoin est grep
et dd
, et un accès au périphérique brut.
Pour les petits fichiers texte, la seule grep
commande dans la réponse de @Steven D dans la question à laquelle vous êtes lié est la manière la plus simple:
grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
Mais pour les fichiers plus volumineux pouvant se trouver dans plusieurs blocs non contigus, voici ce que je fais:
grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file
qui vous donnera le décalage en octets de la ligne correspondante. Suivez ceci avec une série de dd
commandes, en commençant par
dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
Vous voudriez aussi lire quelques blocs avant et après ce bloc. Sur UFS, les blocs de fichiers font généralement 8 Ko et sont généralement alloués de manière relativement contiguë, les blocs d’un fichier étant entrelacés en alternance avec des blocs de 8 Ko provenant d’autres fichiers ou de l’espace disponible. La queue d'un fichier sur UFS est constituée de 7 fragments de 1 Ko maximum, pouvant être contigus ou non.
Bien entendu, sur les systèmes de fichiers qui compressent ou chiffrent des données, la récupération peut ne pas être aussi simple.
Il existe actuellement très peu d'utilitaires dans Unix qui écraseront les blocs de données d'un fichier existant. Un qui vient à l'esprit est dd conv=notrunc
. Un autre est shred
.