27 июня 2010 г. Linux Ubuntu

Восстановление данных в Ubuntu

Удалил я все файлы в домашней директории на своем нетбуке. Удалял через консоль, поэтому из корзины не восстановить. Самое важное было наверное фотографии, конфиг emacs и некоторые документы малой важности. Начал искать средства типа "undelete" и прочие, и натолкнулся на foremost, которая мне показалась самой простой в использовании.

Сразу скажу любителям высказываний "это все из-за того что ты сидишь с правами рута постоянно", в домашнем каталоге все файлы с моими правами и сидя я под собой я удалил бы их всеравно! Если бы это была другая директория, то я бы согласился с ними.

Предыстория

А вообще удалил я при странных стечениях обстоятельств, вот как это было:
Запустил mc, нажал Ctrl+O, попал в консоль, далее:

cp -R /www/project /home/adw0rd
cd /home/adw0rd
find ./project -name ".svn" | xargs rm -rf

Теперь захотел выйти из консоли и попасть в mc:
и нажимая Crtl+O, случайно нажал Ctrl+P (прям как наш президент с мое6), при этом нажалась сначала Ctrl+P и вылезла предыдущая команда:

find ./project -name ".svn" | xargs rm -rf

и после чего нажалась сразу Ctrl+O что вернула меня в mc.

Я подумал что ничего страшного, так как я уже в режиме файлового менеджера (в нижней консоли ничего не было), и я захотел зайти в ./project.
Нажимаю на каталог "project"... И вот тут то и настал пипец, mc завис, HDD зашуршал, я стал вырубать консоль, но видимо было уже поздно... :)

Восстановление файлов

Установим утилиту foremost:

sudo apt-get install foremost

Проведет аудит и создаст файл отчета:

foremost -w -i /dev/sda1 -o /path/to/recovery

Восстановит все файлы:

foremost -i /dev/sda1 -o /path/to/recovery

Восстановит файлы определенного типа:

foremost -t jpg -i /dev/sda1 -o /path/to/recovery

Желательно каталог для восстановления иметь на другом носителе, примонтированный в вашу систему, например внешний жесткий диск и т.д. Для того, чтобы восстановленные данные не перезатерли то что вы еще не восстановили.

Скрипт для удаления дубликатов

Так как foremost восстанавливает все подряд, то попадаются дубликаты файлов, которые по содержимому полностью идентичны.
Поэтому я решил написать скриптик, который удалит дубликаты и оставит только оригиналы.

#!/usr/bin/env python

import os, sys
from hashlib import md5

COLOR_RESET = "\033[0m"
COLOR_RED = "\033[1;31m"
COLOR_GREEN = "\033[1;32m"

def main(path):
    hashes = []
    filenames = []

    for root, dirs, files in os.walk(path):
        files_len = 0

        for file in files:
            files_len += 1
            path_to_file = path + file
            f = open(path_to_file).read()
            fhash = md5(f).hexdigest()
            try:
                i = hashes.index(fhash)
                #if f == open(path + filenames[i]).read():
                #    print COLOR_RED + path_to_file + ' --- remove!' + COLOR_RESET
                #    os.remove(path_to_file)
                print COLOR_RED + path_to_file + ' --- remove!' + COLOR_RESET
                os.remove(path_to_file)
            except ValueError:
                print COLOR_GREEN + path_to_file + ' --- UNIQ!' + COLOR_RESET
                hashes.append(fhash)
                filenames.append(file)
        hashes_len = len(hashes)
        print "--------------------------------"
        print "Files: " + str(files_len)
        print "Deleted: " + str(files_len - hashes_len)
        print "Rest: " + str(hashes_len)

if __name__ == "__main__":
    main(sys.argv[1])

Он получает md5-хеш содержимого файла, кладет его в список, если в списке уже есть такой хеш, то файл удаляется, если нет, то переходит к следующему файлу.
Для тех кто думает что могут быть коллизии, то надо расскоментить в середине скрипта блок кода, который проверит еще и по содержимому файлу, в случае если его хеш найден в списке.

Пользоваться надо так:

./remover.py /recovery/jpg/

Обезопасим себя на будущее

Ну, начнем с малого, в ~/.bashrc (либо в другом шеле, например ~/.cshrc) пропишем алиас, который перед удалением будет задавать вопрос:

alias rm="rm -i"

Мне это не особо нравится, так как надоедает...

Утилита trash-cli

Еще лучше идея с фоновым перемещением данных в корзину, например изложенная недавно тут Анатолием Лариным. Для этого будем использовать утилиту trash-cli, которая написана на python и состоящая из нескольких команд, о которых ниже...

У каждого пользователя системы есть своя корзина, что то вроде:

/home/<username>/.local/share/Trash/files
/root/.local/share/Trash/files

Вот там то и будут храниться наши файлы, которые при необходимости мы сможем вытащить или удалить насовсем.

Установим утилиту "trash-cli":

sudo apt-get install trash-cli

Создаем алиас на удаление (~/.bashrc, а так же не забудьте прописать для /root/.bashrc):

alias rm='trash'

Удаление как и раньше будет через rm, а просмотреть список "удаленных" (точнее у нас они будут не удаленные, а перемещенными в корзину) файлов можно так:

list-trash

Очистка корзины:

empty-trash

Для любопытных: я пробовал создать пользователя, накидать туда файлов и каталогов, после чего удалить все у него, но он споткнулся на каталоге корзины и выкинул эксепшен, так что данные останутся целы.

Напоследок

После удаления поменьше нервничайте и все вы сможете восстановить, главное не паникуйте, а то дров еще больших нарубите! :)

Комментарии

Эх Мийка, опять с "rm rf" балуешся :)
А за статью спасибо.

Да, обожаю эту команду! :)

Ты охуенен! Всегда находишь себе геморрой поинтереснее...

Апнул статью, добавил скрипт для уникализации восстановленных файлов

Почему не
find . -name ".svn" -exec rm -rf {} \; -print

А где мой комментарий? Почему не добавился?

Почему не find . -name «.svn» -exec rm -rf {} \; -print

Ну, потому что длинее, хотя так тоже пользуюсь иногда :)

Ну, потому что длинее, хотя так тоже пользуюсь иногда :)

Мда уж

svn export /home/adw0rd /home/adw0rd_build

Да это понятно, но не всегда доступно, поэтому быстро привыкаешь к универсальному решению

как вариант

rm -rf find . -type d -name .svn

xargs подходит для Джек Потрошителя

а как он дубликаты сортирует? По времени создания?

Такая вот ситуация... под виндой накрылся диск, т.е. физически он виден, но в директории не зайти... из под убунты открылся, приятель порекомендовал сделать бэкап нужных папок, сказано сделано, но во время выполнения операции бэкапа выскочило окно сообщающее что то типа того, что есть нечитаемые сектора... все ок, только вот после бэкапа исчезло много нужных файлов, в основном фотографии... исчезло в прямом смысле этого слова, будто их и не было. Кто подскажет, как можно восстановить данные. Диск USB-шный, NTFS, под виндой не читается.

Погуглите такие программы как GetDataBack, mhdd

была подобная ситуация с ufs2 тоже под виндой восстановили, название проги уже не помню

А если случайно удалил папку, например папка "123" и мне не надо другие файлы. как конкретно можно только эту папку со всем её содержимым вытащить на место?

Когда удаляются файлы, то удаляется запись в системной таблице файловой системы и получается что пути до файла уже не существует. Так что придется все восстановить, а потом найти свои файлы. Возможно, в современных ФС есть какие-либо бекапы для файловой таблицы или ФС ведет себя подругому как-то, к сожалению, я не большой знаток знаний по устройству ФС.

А какая у вас ФС, кстати?

А что тут надо написать? 15 апреля 2015 г. 14:15

добрый день(ночь).
Проблема такая - я при установке убунты нечаянно отформатировал весь жесткий диск из ntfs в ext. Восстановить всё наверное, нереально, поэтому такой вопрос - foremost выявит хоть как-то неподдерживаемые файлы? Может, какие-то хитрости есть? В частности интересуют txt и mbs(операмэйловский формат)
Спасибо.

Оставьте свой комментарий

Markdown