Восстановление данных в 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
А где мой комментарий? Почему не добавился?
Ну, потому что длинее, хотя так тоже пользуюсь иногда :)
Мда уж
Да это понятно, но не всегда доступно, поэтому быстро привыкаешь к универсальному решению
как вариант
xargs подходит для Джек Потрошителя
а как он дубликаты сортирует? По времени создания?
Такая вот ситуация... под виндой накрылся диск, т.е. физически он виден, но в директории не зайти... из под убунты открылся, приятель порекомендовал сделать бэкап нужных папок, сказано сделано, но во время выполнения операции бэкапа выскочило окно сообщающее что то типа того, что есть нечитаемые сектора... все ок, только вот после бэкапа исчезло много нужных файлов, в основном фотографии... исчезло в прямом смысле этого слова, будто их и не было. Кто подскажет, как можно восстановить данные. Диск USB-шный, NTFS, под виндой не читается.
Погуглите такие программы как GetDataBack, mhdd
была подобная ситуация с ufs2 тоже под виндой восстановили, название проги уже не помню
А если случайно удалил папку, например папка "123" и мне не надо другие файлы. как конкретно можно только эту папку со всем её содержимым вытащить на место?
Когда удаляются файлы, то удаляется запись в системной таблице файловой системы и получается что пути до файла уже не существует. Так что придется все восстановить, а потом найти свои файлы. Возможно, в современных ФС есть какие-либо бекапы для файловой таблицы или ФС ведет себя подругому как-то, к сожалению, я не большой знаток знаний по устройству ФС.
А какая у вас ФС, кстати?
добрый день(ночь).
Проблема такая - я при установке убунты нечаянно отформатировал весь жесткий диск из ntfs в ext. Восстановить всё наверное, нереально, поэтому такой вопрос - foremost выявит хоть как-то неподдерживаемые файлы? Может, какие-то хитрости есть? В частности интересуют txt и mbs(операмэйловский формат)
Спасибо.
Оставьте свой комментарий