Прочитайте останній кінець файлу, щоб відновити дані


12

Дуже старий .swp файл повернув файл, який я редагував, і тепер він значно коротший. З цього часу я нічого не робив у цьому каталозі, тому в байтах, що відразу після закінчення файлу, все-таки повинні бути мої дані. Яку функцію я можу використовувати для читання N байтів із заданої адреси пам'яті? ddі readзупиніться на межах файлів, якщо я десь не пропустив варіант.

Поточний розмір файлу - 3,2 КБ. Я не пам’ятаю точно, наскільки великий був файл до того, як він був усічений, але, мабуть, не більше 10 Кб. Як я можу прочитати 10 Кб з початку файлу, ігноруючи межі файлу? Це добре, якщо дані не зберігаються ідеально, до тих пір, поки мені не доведеться починати з нуля.

Відповіді:


18

Зазвичай, коли редактори зберігають файли, вони видаляють або скорочують до 0, тим самим звільняючи виділений простір, а потім записують, що виділяє новий простір. Це призводить до того, що файлова система розміщує дані у зовсім іншому фізичному місці. Тож ваша ідея може не спрацювати.

Ви можете отримати фізичне розташування файлу за допомогою filefragабо hdparm --fibmap, а потім скористатися ddдля читання цього фізичного місцезнаходження безпосередньо. Я описав цей процес у іншому контексті тут: /unix//a/85880/30851


У вашому випадку швидше за все вам потрібен загальний підхід до пошуку текстових даних ... щось на кшталт:

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

strings буде шукати послідовні дані ASCII (також підтримує деякі інші кодування, не впевнені в UTF-8. Якщо це код або англійська мова вам це не знадобиться), а також буде друкувати зсув там, де його було знайдено.

text snippetмає бути точним, унікальним зразком тексту, який ви пам’ятаєте, що знаходитесь у тій частині файлу, яку ви шукаєте [в одному рядку]. (Якщо ви цього точно не знаєте, натомість можете схилитись до регулярних виразів.)

-n 12- мінімальна довжина, яку stringsбуде шукати. 12повинна бути довжиною вашої text snippet. Цей параметр необов’язковий, якщо він надається, він може допомогти strings | grepпройти трохи швидше.

Прочитати весь розділ буде потрібно багато часу, але якщо це вдасться, у вас з’явиться зміщення, яке ви зможете подати, ddщоб захопити загальну область, а потім видалити речі, які не належать.

З того часу я нічого не робив у цьому каталозі

Якщо ваш каталог не є точкою монтажу ... більшість файлових систем насправді не резервують простір "за каталогом", тому ... будь-яка запис у всій файловій системі може перезаписати потрібний біт. У ситуації відновлення даних ви зазвичай переключаєте всю річ у режим лише для читання.


Зауважте, що кожен файл зберігається у багатьох блоках, і вони зазвичай не зберігаються послідовно. Так stringsви знайдете лише деякі частини файлу, якщо вам не пощастить.
Жил 'SO- перестань бути злим'

3
Зовсім навпаки, вам доведеться бути надзвичайно невдалим, щоб знайти фрагментований файл 10 КБ. Якщо ви знайдете лише частину, швидше за все інша частина була перезаписана в цьому випадку. Але якщо ви не маєте великої активності в записі у цій файловій системі або це SSD з миттєвою відмовою, якщо ви зберегли цей файл кілька разів під час редагування, ви можете знайти багато копій цього файлу.
frostschutz

3
Я рекомендую strings -n16або якусь розумну мінімальну довжину, щоб вона пройшла швидше.
Пітер Кордес

Добрий момент, додав це до відповіді.
frostschutz

4
Дякую купу. Лише в кінці файлу було сміття, але stringsя зміг знайти весь файл в іншому місці розділу. Це майже два місяці роботи, над якими мені не доводиться займатись, і відмінне нагадування про те, щоб завжди використовувати контроль версій для чогось важливого.
Меттью Бедфорд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.