Lire la fin du fichier pour récupérer les données

12

Un très ancien fichier .swp a annulé un fichier que j'étais en train de modifier, il est donc désormais beaucoup plus court. Je n'ai rien fait dans ce répertoire depuis, donc les octets suivant immédiatement la fin du fichier devraient toujours avoir mes données. Quelle fonction puis-je utiliser pour lire N octets à partir d'une adresse mémoire donnée? ddet readarrêter aux limites des fichiers, sauf si j'ai manqué une option quelque part.

La taille actuelle du fichier est de 3,2 Ko. Je ne me souviens pas exactement de la taille du fichier avant qu'il ne soit tronqué, mais probablement pas plus de 10 Ko. Comment puis-je lire 10 Ko depuis le début du fichier, en ignorant les limites du fichier? C'est bien si les données ne sont pas parfaitement conservées, tant que je n'ai pas à recommencer à zéro.

Matthew Bedford
la source

Réponses:

18

Habituellement, lorsque les éditeurs enregistrent des fichiers, ils suppriment ou tronquent à 0, libérant ainsi l'espace alloué, puis écrivent, ce qui alloue un nouvel espace. Il en résulte que le système de fichiers place les données dans un emplacement physique complètement différent. Votre idée pourrait donc ne pas fonctionner.

Vous pouvez obtenir l'emplacement physique d'un fichier à l'aide de filefragou hdparm --fibmap, puis utiliser ddpour lire cet emplacement physique directement. J'ai décrit ce processus dans un contexte différent ici: /unix//a/85880/30851


Dans votre cas, il est plus probable que vous ayez besoin de l'approche générale pour trouver des données textuelles ... quelque chose comme:

strings -n 12 -t d /dev/partition | grep -F 'text snippet'

strings recherchera des données ASCII consécutives (prend également en charge certains autres encodages, vous n'êtes pas sûr de l'UTF-8. Si c'est du code ou de l'anglais, vous n'en aurez pas besoin) et il imprimera également l'offset où il a été trouvé.

text snippetdevrait être un exemple de texte exact et unique dont vous vous souvenez avoir été dans la partie du fichier que vous recherchez [sur une seule ligne]. (Si vous ne le savez pas exactement, vous pouvez plutôt utiliser grep avec des expressions régulières.)

-n 12est la longueur minimale stringsrecherchée. 12devrait être la longueur de votre text snippet. Ce paramètre est facultatif, s'il est fourni, il pourrait aider strings | grepà aller un peu plus vite.

La lecture de la partition entière prendra beaucoup de temps, mais en cas de succès, vous disposerez d'un décalage que vous pourrez alimenter ddpour saisir la zone générale, puis supprimer les éléments qui n'appartiennent pas.

Je n'ai rien fait dans ce répertoire depuis

Si votre répertoire ne se trouve pas être un point de montage ... la plupart des systèmes de fichiers ne réservent pas vraiment d'espace "par répertoire" donc ... toutes les écritures dans le système de fichiers entier peuvent écraser le bit que vous recherchez. Dans une situation de récupération de données, vous basculez généralement le tout en mode lecture seule.

frostschutz
la source
Notez que chaque fichier est stocké dans de nombreux blocs et qu'ils ne sont généralement pas stockés consécutivement. Donc strings, ne localisera que certaines parties du fichier, sauf si vous êtes extrêmement chanceux.
Gilles 'SO- arrête d'être méchant'
3
Bien au contraire, il faudrait être extrêmement malchanceux pour trouver un fichier fragmenté de 10 Ko. Si vous ne trouvez qu'une partie, il est plus probable que l'autre partie ait été remplacée dans ce cas. Mais à moins que vous n'ayez beaucoup d'activité d'écriture dans ce système de fichiers, ou qu'il s'agisse d'un SSD avec suppression instantanée, si vous avez enregistré ce fichier plusieurs fois pendant la modification, vous pouvez trouver de nombreuses copies de ce fichier.
frostschutz
3
Je recommanderais strings -n16ou une longueur minimale raisonnable, pour l'accélérer.
Peter Cordes
Bon point, l'a ajouté à la réponse.
frostschutz
4
Merci beaucoup. Il n'y avait que des ordures juste après la fin du fichier, mais stringsj'ai pu trouver le fichier entier ailleurs dans la partition. C'est presque deux mois de travail que je n'ai pas à refaire, et un excellent rappel de toujours utiliser le contrôle de version pour tout ce qui est important.
Matthew Bedford