Удалил я все файлы в домашней директории на своем нетбуке. Удалял через консоль, поэтому из корзины не восстановить. Самое важное было наверное фотографии, конфиг emacs и некоторые документы малой важности. Начал искать средства типа «undelete» и прочие, и натолкнулся на , которая мне показалась самой простой в использовании.
Сразу скажу любителям высказываний «это все из-за того что ты сидишь с правами рута постоянно», в домашнем каталоге все файлы с моими правами и сидя я под собой я удалил бы их всеравно! Если бы это была другая директория, то я бы согласился с ними.
Предыстория
А вообще удалил я при странных стечениях обстоятельств, вот как это было:
Запустил mc, нажал Ctrl+O, попал в консоль, далее:
cd /home/adw0rd
find ./project -name ".svn" | xargs rm -rf
Теперь захотел выйти из консоли и попасть в mc:
и нажимая Crtl+O, случайно нажал Ctrl+P (прям как наш президент с ), при этом нажалась сначала Ctrl+P и вылезла предыдущая команда:
и после чего нажалась сразу Ctrl+O что вернула меня в mc.
Я подумал что ничего страшного, так как я уже в режиме файлового менеджера (в нижней консоли ничего не было), и я захотел зайти в ./project.
Нажимаю на каталог «project»... И вот тут то и настал пипец, mc завис, HDD зашуршал, я стал вырубать консоль, но видимо было уже поздно... :)
Восстановление файлов
Установим утилиту foremost:
Проведет аудит и создаст файл отчета:
Восстановит все файлы:
Восстановит файлы определенного типа:
Желательно каталог для восстановления иметь на другом носителе, примонтированный в вашу систему, например внешний жесткий диск и т.д. Для того, чтобы восстановленные данные не перезатерли то что вы еще не восстановили.
Скрипт для удаления дубликатов
Так как foremost восстанавливает все подряд, то попадаются дубликаты файлов, которые по содержимому полностью идентичны.
Поэтому я решил написать скриптик, который удалит дубликаты и оставит только оригиналы.
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-хеш содержимого файла, кладет его в список, если в списке уже есть такой хеш, то файл удаляется, если нет, то переходит к следующему файлу.
Для тех кто думает что могут быть коллизии, то надо расскоментить в середине скрипта блок кода, который проверит еще и по содержимому файлу, в случае если его хеш найден в списке.
Пользоваться надо так:
Обезопасим себя на будущее
Ну, начнем с малого, в ~/.bashrc (либо в другом шеле, например ~/.cshrc) пропишем алиас, который перед удалением будет задавать вопрос:
Мне это не особо нравится, так как надоедает...
Утилита trash-cli
Еще лучше идея с фоновым перемещением данных в корзину, например изложенная недавно Анатолием Лариным. Для этого будем использовать утилиту trash-cli, которая написана на python и состоящая из нескольких команд, о которых ниже...
У каждого пользователя системы есть своя корзина, что то вроде:
/root/.local/share/Trash/files
Вот там то и будут храниться наши файлы, которые при необходимости мы сможем вытащить или удалить насовсем.
Установим утилиту «trash-cli»:
Создаем алиас на удаление (~/.bashrc, а так же не забудьте прописать для /root/.bashrc):
Удаление как и раньше будет через rm, а просмотреть список «удаленных» (точнее у нас они будут не удаленные, а перемещенными в корзину) файлов можно так:
Очистка корзины:
Для любопытных: я пробовал создать пользователя, накидать туда файлов и каталогов, после чего удалить все у него, но он споткнулся на каталоге корзины и выкинул эксепшен, так что данные останутся целы.
Напоследок
После удаления поменьше нервничайте и все вы сможете восстановить, главное не паникуйте, а то дров еще больших нарубите! :)



Эх Мийка, опять с «rm rf» балуешся :)
А за статью спасибо.
Да, обожаю эту команду! :)
Ты охуенен! Всегда находишь себе геморрой поинтереснее...
Апнул статью, добавил скрипт для уникализации восстановленных файлов
Почему не
find . -name «.svn» -exec rm -rf {} \; -print
А где мой комментарий? Почему не добавился?
Ну, потому что длинее, хотя так тоже пользуюсь иногда :)
Мда уж
Да это понятно, но не всегда доступно, поэтому быстро привыкаешь к универсальному решению
как вариант
xargs подходит для Джек Потрошителя