Unix / Linux видалити / відновити видалені файли


124

Чи існує команда відновити / відновити видалені файли rm?

$ rm -rf /path/to/myfile

Як я можу відновитись myfile? Якщо є такий інструмент, як його використовувати?


1
cyberciti.biz/tips/… може допомогти. Також краще в Stack Exchange .
fedorqui

1. Це було б краще для Unix & Linux 2. Резервні копії?

1
Перш ніж робити щось, встановіть файлову систему лише для читання, щоб переконатися, що дані не перезаписані. Також погляньте на цей пост: superuser.com/questions/170857/ext4-undelete-utilities .

1
@EvanTeitelman ви маєте на увазі, що повторне читання лише для читання - це краще, ніж спробувати відновити файл під час оновлення? До речі, midnightcommander (тс) спосіб, припускає umounting datarecoverypros.com/recover-linux-midnightcommander.html
Водолій Потужність

1
Найкраще рішення - подумати заздалегідь і використовувати інструмент контролю ревізії.
ctrl-alt-delor

Відповіді:


66

Посилання, яке хтось подав у коментарях, - це, мабуть, найкраща можливість.

Linux debugfs Hack: Видалити файли

Це написання, хоча дивлячись трохи залякує, насправді досить прямо вперед. Загалом кроки такі:

  1. Використовуйте налагодження для перегляду журналу файлових систем

    $ debugfs -w /dev/mapper/wks01-root
    
  2. У настанові налагодження

    debugfs: lsdel
    
  3. Вибірка зразка

    Inode  Owner  Mode    Size    Blocks   Time deleted
    23601299      0 120777      3    1/   1 Tue Mar 13 16:17:30 2012
    7536655      0 120777      3    1/   1 Tue May  1 06:21:22 2012
    2 deleted inodes found.
    
  4. Виконайте команду в налагодженнях

    debugfs: logdump -i <7536655>
    
  5. Визначте файли inode

    ...
    ...
    ....
    output truncated
        Fast_link_dest: bin
        Blocks:  (0+1): 7235938
      FS block 7536642 logged at sequence 38402086, journal block 26711
        (inode block for inode 7536655):
        Inode: 7536655   Type: symlink        Mode:  0777   Flags: 0x0   Generation: 3532221116
        User:     0   Group:     0   Size: 3
        File ACL: 0    Directory ACL: 0
        Links: 0   Blockcount: 0
        Fragment:  Address: 0    Number: 0    Size: 0
        ctime: 0x4f9fc732 -- Tue May  1 06:21:22 2012
        atime: 0x4f9fc730 -- Tue May  1 06:21:20 2012
        mtime: 0x4f9fc72f -- Tue May  1 06:21:19 2012
        dtime: 0x4f9fc732 -- Tue May  1 06:21:22 2012
        Fast_link_dest: bin
        Blocks:  (0+1): 7235938
    No magic number at block 28053: end of journal.
    
  6. З вищевказаною інформацією про введення виконайте наступні команди

    # dd if=/dev/mapper/wks01-root of=recovered.file.001 bs=4096 count=1 skip=7235938
    # file recovered.file.001
    file: ASCII text, with very long lines
    

Файли було відновлено до recovered.file.001.

Інші варіанти

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

Як відновити пошкоджені файли jpeg та mov з SDD-картки цифрової камери на Fedora / CentOS / RHEL .


11
Я спробував, debugfs -w /dev/sdb2але lsdelsais:0 deleted inodes found.
rubo77

5
використання extundeleteпростішого для ext3 / 4 і, ймовірно, призведе до тих же результатів.
eadmaster

1
це працювало для відновлення файлу, але я отримав @ y T6 Ԝ * e 0 v' T 0 <#selinuxsystem_u: object_r: rpm_var_lib_t: s0 } y T6 ..... спроба conv = ascii, conv = ibm, а conv = ebcdic дає таку ж проблему
codyc4321

2
lsdel: Файлова система не відкрита, як її вирішити?
Амітабха

3
Я розумію /dev/mapper/wks01-root: No such file or directory while opening filesystemДе ти це взяв /dev/mapper/wks01-root?
Марко Авліяш

29

Маючи трохи шансів, іноді я можу відновити видалені файли за допомогою цього сценарію чи наступного рішення у відповідь:

#!/bin/bash

if [[ ! $1 ]]; then
    echo -e "Usage:\n\n\t$0 'file name'"
    exit 1
fi

f=$(ls 2>/dev/null -l /proc/*/fd/* | fgrep "$1 (deleted" | awk '{print $9}')

if [[ $f ]]; then
    echo "fd $f found..."
    cp -v "$f" "$1"
else
    echo >&2 "No fd found..."
    exit 2
fi

Є ще один корисний трюк: якщо ви знаєте шаблон у видалених файлах, наберіть alt+ sys+, resuoщоб перезавантажити + перезавантажити лише для читання, а потім за допомогою живого cd, використовуйте grepдля пошуку на жорсткому диску:

grep -a -C 500 'known pattern' /dev/sda | tee /tmp/recover

потім відредагуйте, /tmp/recoverщоб зберегти лише ті, що були у вашому файлі раніше.

Гей, якщо з філософією Unix всі файли, пора скористатися цим, ні?


5
Ваше grepбазоване рішення дуже розумне і працює для мене, навіть якщо файлова система все ще встановлена. Дякую!
wchargin

Я не розумію, як працює греп-рішення для вас, воно виводить лише двійкові дані. Чим це корисно?
w00t

2
@ w00t Звичайно, "лише" випльовує двійкові дані. Але іноді ці двійкові дані містять біти ASCII, відповідні файлу, який я шукаю. Я думаю, я не розумію питання?
wchargin

@ w00t хитрість полягає у використанні схеми пошуку, яка є дуже специфічною для цього файлу. Команда grep займе 500 рядків до і після кожного відповідного рядка, тому вона все одно випльовуватиме безліч невідповідних даних, але з текстовим редактором, який може впоратися з цим (наприклад, Vim), легко розібрати добро з погані речі. Ви також можете відфільтрувати всі рядки з grep -av "[^[:print:]]"
недрукуваними символами, пропустивши

grepРішення працював для мене з модифікацією: я зробив sudo grep --line-buffered -ab "$PATTERN" /dev/sda1 | tee linesі отримав зміщення байта (як 123123123:line\n456456456:another\n...), а потім зробив n=1000; sudo dd of=before if=/dev/sda1 ibs=1 skip=$[123123123-$n] count=$nі n=1000; sudo dd of=after if=/dev/sda1 ibs=1 skip=123123123 count=$nз різними nзначеннями.
Кирило Булигін

21

Те, що для мене працювало, було надано аркою (стосується лише текстових файлів):

grep -a -C 200 -F 'Unique string in text file' /dev/sdXN

де /dev/sdXNрозділ, що містить загублений файл (перевірте, mountчи не впевнений).

Займає трохи часу, але працював, коли я випадково видалив якийсь вихідний код, якого я ще не вніс!


4
Дуже корисно для програмістів !. зазвичай ми завжди втрачали власні коди.
піловер

1
розкажіть про це, я випадково побіг rm data/*.json python myFile.pyзамістьrm data/*.json && python myFile.py
Вільям Бекер

2
Спасибі товаришу, ти щойно допоміг мені відновити текстовий файл, який я 2 години писав вночі. PS /dev/sdXN- це для файлової системи, правда? Я знайшов свою зdf -T | awk '{print $1,$2,$NF}' | grep "^/dev"
Олексій

Я бачу лише двійковий файл. Чи є спосіб перетворити його у звичайний формат?
сильгон

grep: conflicting matchers specified
Початок

10

Хоча це питання вирішено і вже кілька років, я хочу згадати утиліту testdisk .

Як відновити файли за допомогою тестового диска, пояснено в цьому підручнику . Для відновлення запуску файлів testdisk /dev/sdXвиберіть тип таблиці розділів. Після цього виберіть [ Advanced ] Filesystem Utils, а потім виберіть свій розділ та виберіть [Undelete]. Тепер ви можете переглядати та вибирати видалені файли та копіювати їх до іншого місця у вашій файловій системі.


Він не бачить мій / DEV / nvme0n1p2
H22

6

У мене була така ж проблема минулого тижня, і я спробував багато програм, таких як налагодження, фотореклама, ext3grep та extundelete. ext3grep була найкращою програмою для відновлення файлів. Синтаксис дуже простий:

ext3grep image.img --restore-all

або:

ext3grep /dev/sda3 --restore-all --after date -d '2015-01-01 00:00:00' '+%s' --before `date -d ‘2015-01-02 00:00:00’ ‘+%s’

Це відео - міні-підручник, який може вам допомогти.


6

Альтернативою може бути використання delзамість rmвидалення:

http://fex.belwue.de/fstools/del.html

del має функцію відновлення і працює з будь-якою файловою системою.

Звичайно, це не рішення, якщо ви вже видалили свої файли з "не бери в'язнів" rm: -}


1
Не відповідь, як ви вже сказали, але спасибі за введення del команди.
піловер

5

підключити диск через зовнішній інтерфейс

  1. кріплення
  2. umount /dev/{sd*}
  3. extundelete --restore-all /dev/{sd*}
  4. результати переходять до домашньої папки на завантажувальному диску
  5. бонусні бали: напишіть для цього графічний інтерфейс

Перейдіть за цим посиланням для отримання додаткової інформації: видаліть щойно видалений файл на ext4 з extundelete .


2
Скажімо, поясніть, чому ви вважаєте, що extundelete не є гарним варіантом?
webminal.org

2
Приємно! Дякуємо за публікацію extundelete - це новий інструмент для мене. Я використовував це сьогодні і вважаю це надзвичайно корисним. Набагато корисніший ІМО, ніж прийнята відповідь. Єдине, що я хотів би додати до цієї відповіді, щоб трохи її покращити, - це (1) повторити вказівки в деяких інших відповідях, що слід вимкнути уражений комп'ютер, як тільки зрозумієш, що файли були помилково видалені, і (2) завантаження з liveCD або liveUSB ОС, наприклад Kali Linux, яка включає утиліту extundelete (я виявив, що багато інших liveCD, як Debian Jessie, не включають цю утиліту на свій носій для встановлення).
Остеобун

4

Інструменти відновлення - командний рядок:

Інструменти відновлення - Gui:

Інформація:

В особистому досвіді я повертаю свої дані за допомогою ufs-explorer та photorec

(1) = Не відкритий код, не безкоштовний

(2) = Не з відкритим кодом, безкоштовно

(3) = Відкритий і безкоштовний

(4) = Мати підтримку ntfs

(5) = Мати функцію структури каталогів


1

Я не погоджуюся з тим, що це неможливо, просто дуже важко, і я ніколи не робив цього з Linux:

Коли файли видаляються, вони фактично не видаляються. Що трапляється, що простір, який вони були на жорсткому диску, є своєрідним скиданням, так що якщо комп'ютер намагається записати туди дані, ніхто не скаржиться. Як правило, дані на вашому жорсткому диску, які ви думали, що ви видалили, можуть бути там майже через рік. Або принаймні, це мій досвід роботи на машині Windows. Чи працює він так само, як і в командному рядку в Linux, я не впевнений, але вам, швидше за все, потрібен окремий Live CD, щоб відкрити такий розділ, і також немає гарантії, що файли все ще є. Я робив це на Windows xp кілька разів, використовуючи відновлення Zero Assumption. Я впевнений, що існує подібний інструмент, якщо ви виглядаєте досить важко.


Залежно від ситуації це може бути на 100% неможливим. Це може бути, а може і не працювати, але ви ніколи не маєте жодних гарантій.
клотт

0

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

Одним із способів збереження файлів буде написання функції, яка дозволить вам перемістити файли в кошик для сміття (скажімо так $HOME/.trash) і відновити потрібні файли звідти. Ця функція може бути псевдонімна rm. Ви можете запланувати завдання cron для видалення файлів, які були в кошику протягом певної кількості днів.


0

Це може врятувати неприємності для когось із вас.
Якщо ви коли-небудь використовували gedit для редагування цього файлу, за замовчуванням буде створена його копія.
Наприклад, припустимо, ми випадково видалили "myfile.txt".
У папці, в якій містився файл, який ви тільки що видалили, використовуйте ці команди, і ви відновите копію звідти.
ls | grep 'myfile.txt~'
Зі трохи удачі ви знайдете її, а потім:
cp 'myfile.txt~' 'myfile.txt'
я відновив файл лише зараз, використовуючи цей метод. Удачі!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.