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


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будет только найти некоторые части файла, если вам не повезло.
Жиль "ТАК - перестань быть злым"

3
Наоборот, вам нужно быть крайне неудачным, чтобы найти фрагментированный файл размером 10 КБ. Если вы найдете только часть, скорее всего, в этом случае другая часть была перезаписана. Но если у вас нет большой активности записи в этой файловой системе, или это SSD с мгновенным сбросом, если вы сохранили этот файл несколько раз во время редактирования, вы можете найти много копий этого файла.
frostschutz

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

Хороший вопрос, добавил его в ответ.
frostschutz

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