Unix / Linux phục hồi / khôi phục các tập tin đã xóa


124

Có một lệnh để phục hồi / phục hồi các tập tin bị xóa bằng cách rm?

$ rm -rf /path/to/myfile

Làm thế nào tôi có thể phục hồi myfile? Nếu có một công cụ như vậy làm thế nào tôi có thể sử dụng nó?


1
cyberciti.biz/tips/ trên có thể giúp đỡ. Ngoài ra, nó là tốt hơn trong Stack Exchange .
fedorqui

1. Điều này sẽ tốt hơn cho Unix & Linux 2. Sao lưu?

1
Trước khi bạn làm bất cứ điều gì, hãy gắn hệ thống tập tin chỉ đọc để đảm bảo dữ liệu không bị ghi đè. Ngoài ra, hãy xem bài đăng này: superuser.com/questions/170857/ext4-undelete-utilities .

1
@EvanTeitelman, ý bạn là chỉ đọc lại tốt hơn là cố gắng khôi phục tập tin trong khi nó bị xóa? Cách btw, midnightcommander (mc), gợi ý vượt qua datarecoverypros.com/recover-linux-midnightcommander.html
Sức mạnh của Bảo Bình

1
Giải pháp tốt nhất là suy nghĩ trước và sử dụng một công cụ kiểm soát sửa đổi.
ctrl-alt-delor

Câu trả lời:


66

Liên kết ai đó được cung cấp trong các ý kiến ​​có thể là cơ hội tốt nhất của bạn.

Linux gỡ lỗi Hack: Phục hồi tập tin

Việc viết lên mặc dù trông hơi đáng sợ nhưng thực sự khá dễ dàng để làm theo. Nói chung các bước như sau:

  1. Sử dụng debugfs để xem nhật ký hệ thống tập tin

    $ debugfs -w /dev/mapper/wks01-root
    
  2. Tại dấu nhắc gỡ lỗi

    debugfs: lsdel
    
  3. Sản lượng mẫu

    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. Chạy lệnh trong debugfs

    debugfs: logdump -i <7536655>
    
  5. Xác định tập tin 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. Với thông tin inode trên, chạy các lệnh sau

    # 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
    

Tập tin đã được phục hồi recovered.file.001.

Sự lựa chọn khác

Nếu những điều trên không dành cho bạn, tôi đã sử dụng các công cụ như photorecđể khôi phục các tệp trong quá khứ, nhưng nó chỉ dành cho các tệp hình ảnh. Tôi đã viết về phương pháp này rộng rãi trên blog của mình trong bài viết này có tiêu đề:

Cách khôi phục các tệp jpeg và Mov bị hỏng từ Thẻ SDD của máy ảnh kỹ thuật số trên Fedora / CentOS / RHEL .


11
Tôi đã thử với debugfs -w /dev/sdb2nhưng lsdelsais:0 deleted inodes found.
rubo77

5
sử dụng extundeletedễ dàng hơn cho ext3 / 4 và có thể sẽ dẫn đến kết quả tương tự.
eadmaster

1
điều này đã làm việc để khôi phục một tập tin, nhưng tôi đã nhận được @ y U T6 Ԝ * e 0 v' T 0 <#selinuxsystem_u: object_r: rpm_var_lib_t: s0} y U T6 ..... đang cố gắng = ascii, conv = ibm và conv = ebcdic mang lại cùng một vấn đề
codyc4321

2
lsdel: Hệ thống tập tin không mở, làm thế nào để giải quyết nó?
Amitābha

3
Tôi nhận được /dev/mapper/wks01-root: No such file or directory while opening filesystemBạn đã lấy cái này /dev/mapper/wks01-roottừ đâu?
Marko Avlijaš

29

Với một chút cơ hội, đôi khi tôi có thể khôi phục các tệp đã bị xóa bằng tập lệnh này hoặc giải pháp tiếp theo trong câu trả lời:

#!/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

Có một mẹo hữu ích: nếu bạn biết một mô hình trong các tập tin đã xóa của bạn, loại alt+ sys+ resuokhởi động lại + remount trong read-only, sau đó với một live-cd, sử dụng grepđể tìm kiếm trong các ổ đĩa cứng:

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

sau đó chỉnh sửa /tmp/recoverđể chỉ giữ lại (các) tệp của bạn trước đó.

Này, nếu với triết lý unix tất cả là các tập tin, đã đến lúc tận dụng lợi thế này, phải không?


5
grepGiải pháp dựa trên của bạn rất thông minh và hiệu quả với tôi, ngay cả với hệ thống tệp vẫn được gắn. Cảm ơn!
wchargein

Tôi không hiểu làm thế nào giải pháp grep làm việc cho bạn, nó chỉ xuất ra dữ liệu nhị phân. Làm thế nào là hữu ích?
w00t

2
@ w00t Chắc chắn, nó "chỉ" phun ra dữ liệu nhị phân. Nhưng đôi khi dữ liệu nhị phân đó xảy ra để chứa các bit ASCII tương ứng với tệp tôi đang tìm kiếm. Tôi đoán tôi không hiểu câu hỏi?
wchargein

@ w00t mẹo là sử dụng một mẫu tìm kiếm rất cụ thể cho tệp đó. Lệnh grep sẽ lấy 500 dòng trước và sau mỗi dòng khớp, vì vậy nó sẽ vẫn tiết ra nhiều dữ liệu không liên quan, nhưng với trình soạn thảo văn bản có thể đối phó với điều đó (ví dụ Vim), thật dễ dàng để phân loại tốt Những thứ xấu. Bạn cũng có thể lọc ra tất cả các dòng có ký tự không thể in được bằng cách chuyển nó qua một lệnh grep khác:grep -av "[^[:print:]]"
CJStuart

Các grepgiải pháp làm việc cho tôi với một sự sửa đổi: Tôi đã làm sudo grep --line-buffered -ab "$PATTERN" /dev/sda1 | tee linesvà có hiệu số byte (như 123123123:line\n456456456:another\n...), sau đó đã làm n=1000; sudo dd of=before if=/dev/sda1 ibs=1 skip=$[123123123-$n] count=$nn=1000; sudo dd of=after if=/dev/sda1 ibs=1 skip=123123123 count=$ncó khác nhau ngiá trị.
Kirill Bulygin

21

Những gì làm việc cho tôi đã được đưa ra bởi vòm (chỉ áp dụng cho các tệp văn bản):

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

nơi /dev/sdXNlà phân vùng chứa file bị mất (kiểm tra với mountnếu không chắc chắn).

Mất một lúc, nhưng đã hoạt động khi tôi vô tình xóa một số mã nguồn mà tôi chưa cam kết!


4
Rất hữu ích cho các lập trình viên!. thông thường, chúng tôi luôn bị mất mã riêng của chúng tôi.
pylover

1
nói cho tôi biết, tôi vô tình chạy rm data/*.json python myFile.pythay vìrm data/*.json && python myFile.py
William Becker

2
Cảm ơn bạn, bạn chỉ giúp tôi khôi phục một tập tin văn bản tôi đã dành 2 giờ để viết vào ban đêm. PS /dev/sdXNlà cho hệ thống tập tin, phải không? Tôi tìm thấy của tôi vớidf -T | awk '{print $1,$2,$NF}' | grep "^/dev"
Alex

Tôi chỉ thấy nhị phân của tập tin. Có cách nào để chuyển đổi nó sang định dạng bình thường?
silgon

grep: conflicting matchers specified
felwithe

10

Mặc dù Câu hỏi này đã được giải quyết và một vài năm tuổi, tôi muốn đề cập đến tiện ích testdisk .

Làm thế nào để phục hồi các tập tin với testdisk được giải thích tốt trong hướng dẫn này . Để khôi phục tập tin chạy testdisk /dev/sdXvà chọn loại bảng phân vùng của bạn. Sau này, chọn [ Advanced ] Filesystem Utils, sau đó chọn phân vùng của bạn và chọn [Undelete]. Bây giờ bạn có thể duyệt và chọn các tệp đã xóa và sao chép chúng sang một vị trí khác trong hệ thống tệp của bạn.


Nó không nhìn thấy tôi / dev / nvme0n1p2
H22

6

Tôi đã có cùng một vấn đề vào tuần trước và tôi đã thử rất nhiều chương trình, như debugfs, photorec, ext3grep và extundelete. ext3grep là chương trình tốt nhất để khôi phục tập tin. Cú pháp rất dễ:

ext3grep image.img --restore-all

hoặc là:

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’

Video này là một hướng dẫn nhỏ có thể giúp bạn.


6

Một sự thay thế có thể được sử dụng delthay vì rmxóa:

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

del có chức năng phục hồi và hoạt động với bất kỳ hệ thống tập tin nào.

Tất nhiên đó không phải là một giải pháp nếu bạn đã xóa các tệp của mình với "không có tù nhân" rm: -}


1
Không phải là một câu trả lời như bạn đã nói, nhưng cảm ơn vì đã giới thiệu del lệnh.
pylover

5

kết nối ổ đĩa thông qua giao diện bên ngoài

  1. gắn kết
  2. umount /dev/{sd*}
  3. extundelete --restore-all /dev/{sd*}
  4. kết quả đi đến thư mục nhà trên ổ đĩa khởi động
  5. điểm thưởng: viết GUI cho cái này

Xem liên kết này để biết thêm thông tin: phục hồi một tập tin vừa bị xóa trên ext4 với extundelete .


2
Downvoters, xin vui lòng giải thích lý do tại sao bạn nghĩ extundelete không phải là lựa chọn tốt?
webminal.org

2
Đẹp! Cảm ơn vì đăng. extundelete là một công cụ mới cho tôi. Tôi đã sử dụng nó ngày hôm nay và thấy nó vô cùng hữu ích. IMO hữu ích hơn nhiều so với câu trả lời được chấp nhận. Điều duy nhất tôi sẽ thêm vào câu trả lời này để cải thiện nó một chút là (1) để nhắc lại các hướng dẫn trong một số câu trả lời khác rằng người ta nên tắt máy tính bị ảnh hưởng ngay khi nhận ra rằng các tệp bị xóa nhầm và (2) khởi động từ hệ điều hành liveCD hoặc liveUSB như Kali Linux, bao gồm tiện ích mở rộng (tôi thấy rằng nhiều liveCD khác như Debian Jessie không bao gồm tiện ích này trên phương tiện cài đặt của họ).
Osteoboon

4

Công cụ khôi phục - Dòng lệnh:

Công cụ khôi phục - Gui:

Thông tin liên lạc

Theo kinh nghiệm cá nhân của tôi, tôi lấy lại dữ liệu của mình bằng cách sử dụng ufs-explorer và photorec

(1) = Không phải nguồn mở, không miễn phí

(2) = Không phải nguồn mở, miễn phí

(3) = Nguồn mở và miễn phí

(4) = Có hỗ trợ ntfs

(5) = Có tính năng cấu trúc thư mục


1

Tôi không đồng ý rằng điều đó là không thể, chỉ là rất rất khó khăn và tôi chưa bao giờ làm điều đó với Linux:

Khi các tập tin bị xóa, chúng không thực sự bị xóa. Điều xảy ra là không gian mà chúng nằm trên ổ cứng là loại thiết lập lại, do đó, nếu máy tính cố gắng ghi dữ liệu ở đó, không có gì phàn nàn. Nói chung, dữ liệu trên ổ cứng mà bạn nghĩ bạn đã xóa có thể ở đó gần một năm sau. Hoặc ít nhất, đây là kinh nghiệm của tôi trên máy Windows. Dù nó có hoạt động theo cách tương tự từ một dòng lệnh trên Linux hay không, tôi không chắc, nhưng bạn có thể cần một đĩa CD riêng để mở phân vùng như vậy và cũng không có gì đảm bảo các tệp vẫn ở đó. Tôi đã thực hiện điều này trên windows xp nhiều lần bằng cách sử dụng Zero Asscharge Recovery. Tôi chắc chắn có một công cụ tương tự xung quanh nếu bạn nhìn đủ cứng.


Tùy thuộc vào tình huống có thể là 100% không thể. Nó có thể hoặc không thể làm việc, nhưng bạn KHÔNG BAO GIỜ có bất kỳ sự đảm bảo nào.
klutt

0

Khi bạn xóa một tệp, số lượng liên kết trong bảng inode cho tệp đó sẽ giảm đi một. Trong Unix, khi số lượng liên kết giảm xuống 0, các khối dữ liệu cho tệp đó được đánh dấu là miễn phí và thông thường, các tham chiếu đến các khối dữ liệu đó sẽ bị mất. Tôi vừa phát hiện từ nhận xét của @ fedorqui rằng có thể có một số cách để truy cập các khối đó nhưng điều đó chỉ áp dụng cho hệ thống tập tin ext3.

Một cách để bảo quản các tệp sẽ là viết một hàm cho phép bạn di chuyển các tệp vào vùng rác (giả sử chúng tôi nói $HOME/.trash) và khôi phục các tệp cần thiết từ đó. Chức năng này có thể được đặt bí danh rm. Bạn có thể lên lịch cho một công việc định kỳ để xóa các tệp đã ở trong khu vực rác trong một số ngày nhất định.


0

Điều này có thể cứu rắc rối cho một số bạn.
Nếu bạn đã từng sử dụng gedit để chỉnh sửa tệp đó, theo mặc định, một bản sao của tệp đó sẽ được tạo.
Ví dụ: giả sử chúng tôi đã vô tình xóa 'myfile.txt'.
Trong thư mục được sử dụng để chứa tệp bạn vừa xóa, hãy sử dụng các lệnh này và bạn sẽ khôi phục bản sao từ đó:
ls | grep 'myfile.txt~'
Với một chút may mắn, bạn sẽ tìm thấy nó và sau đó:
cp 'myfile.txt~' 'myfile.txt'
Tôi đã khôi phục một tệp chỉ bằng phương pháp này. May mắn nhất!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.