Unix / Linux ยกเลิกการลบ / กู้คืนไฟล์ที่ถูกลบ


124

มีคำสั่งให้กู้คืน / ยกเลิกการลบไฟล์ที่ถูกลบrmหรือไม่

$ rm -rf /path/to/myfile

ฉันจะกู้คืนได้myfileอย่างไร หากมีเครื่องมือดังกล่าวฉันจะใช้งานได้อย่างไร?


1
cyberciti.biz/tips/…สามารถช่วยได้ นอกจากนี้ยังเป็นที่ดีกว่าในการแลกเปลี่ยนชุด
fedorqui

1. สิ่งนี้จะดีกว่าสำหรับUnix & Linux 2. สำรองข้อมูล?

1
ก่อนที่คุณจะทำอะไรให้ติดตั้งระบบไฟล์เป็นแบบอ่านอย่างเดียวเพื่อให้แน่ใจว่าข้อมูลไม่ได้ถูกเขียนทับ นอกจากจะดูที่การโพสต์นี้: superuser.com/questions/170857/ext4-undelete-utilities

1
@EvanTeitelman คุณหมายถึงการนับใหม่แบบอ่านอย่างเดียวดีกว่าพยายามกู้คืนไฟล์ขณะที่ติดตั้งหรือไม่ btw, วิธี midnightcommander (mc), แนะนำการติดตั้งdatarecoverypros.com/recover-linux-midnightcommander.html
Aquarius Power

1
ทางออกที่ดีที่สุดคือการคิดล่วงหน้าและใช้เครื่องมือควบคุมการแก้ไข
ctrl-alt-delor

คำตอบ:


66

ลิงค์ที่มีคนแสดงความคิดเห็นน่าจะเป็นโอกาสที่ดีที่สุดของคุณ

Linux debugfs Hack: ยกเลิกการลบไฟล์

บทความนั้นถึงแม้ว่าการมองหาการข่มขู่เล็กน้อยนั้นเป็นสิ่งที่จะต้องปฏิบัติตามอย่างแน่นอน โดยทั่วไปขั้นตอนมีดังนี้:

  1. ใช้ debugfs เพื่อดูบันทึกระบบไฟล์

    $ debugfs -w /dev/mapper/wks01-root
    
  2. ที่พรอมต์ debugfs

    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

    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. ด้วยข้อมูล inode ข้างต้นให้รันคำสั่งต่อไปนี้

    # 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


11
ฉันลองด้วยdebugfs -w /dev/sdb2แต่lsdelsais:0 deleted inodes found.
rubo77

5
การใช้extundeleteext3 / 4 ง่ายกว่าและอาจนำไปสู่ผลลัพธ์เดียวกัน
eadmaster

1
สิ่งนี้ทำงานเพื่อกู้คืนไฟล์ แต่ฉันได้รับ @ y U T6 Ԝ * e 0 v' T 0 <#selinuxsystem_u: object_r: rpm_var_lib_t: S0} yUT6 ..... พยายามแปลง = ASCII, แปลง = IBM และแปลง = อัตราผลตอบแทน EBCDIC ปัญหาเดียวกัน
codyc4321

2
lsdel: ระบบไฟล์ไม่เปิดวิธีการแก้ไขมันได้อย่างไร
Amitābha

3
ฉันได้/dev/mapper/wks01-root: No such file or directory while opening filesystemคุณ/dev/mapper/wks01-rootมาจากที่ไหน
Marko Avlijaš

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เพื่อรีบูต + นับใหม่ในแบบอ่านอย่างเดียวแล้วใช้ live-cd grepเพื่อค้นหาในฮาร์ดไดรฟ์:

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

จากนั้นแก้ไข/tmp/recoverเพื่อเก็บเฉพาะไฟล์ที่คุณเคยมีมาก่อน

เฮ้, ถ้าด้วยปรัชญาของยูนิกซ์ทั้งหมดคือไฟล์, มันถึงเวลาที่จะใช้ประโยชน์จากสิ่งนี้, ไม่ใช่?


5
grepโซลูชันพื้นฐานของคุณนั้นฉลาดและใช้งานได้ดีสำหรับฉันแม้ว่าจะติดตั้งระบบไฟล์แล้วก็ตาม ขอบคุณ!
wchargin

ฉันไม่เข้าใจว่าโซลูชัน grep ทำงานอย่างไรสำหรับคุณมันแสดงผลข้อมูลไบนารีเท่านั้น มันมีประโยชน์อย่างไร?
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ค่า
Kirill Bulygin

21

สิ่งที่ได้ผลสำหรับฉันถูกมอบโดยarch (ใช้กับไฟล์ข้อความเท่านั้น):

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

ที่/dev/sdXNเป็นพาร์ทิชันที่มีไฟล์ที่หายไป (ตรวจสอบกับmountหากไม่แน่ใจ)

ใช้เวลาสักครู่ แต่ทำงานเมื่อฉันลบรหัสที่มาบางอย่างที่ฉันยังไม่ได้ทำ!


4
มีประโยชน์มากสำหรับโปรแกรมเมอร์! โดยปกติเรามักลืมรหัสของตัวเองอยู่เสมอ
pylover

1
บอกฉันเกี่ยวกับมันฉันตั้งใจวิ่งrm data/*.json python myFile.pyแทนrm data/*.json && python myFile.py
William Becker

2
ขอบคุณเพื่อนคุณเพิ่งช่วยฉันกู้คืนไฟล์ข้อความที่ฉันใช้เวลาเขียน 2 ชั่วโมงในเวลากลางคืน PS /dev/sdXNเป็นระบบไฟล์ใช่มั้ย ฉันพบฉันด้วยdf -T | awk '{print $1,$2,$NF}' | grep "^/dev"
อเล็กซ์

ฉันเห็นเพียงไบนารีของไฟล์ มีวิธีแปลงเป็นรูปแบบปกติหรือไม่?
silgon

grep: conflicting matchers specified
felwithe

10

แม้ว่าคำถามนี้จะได้รับการแก้ไขและไม่กี่ปีที่ผ่านมาฉันต้องการพูดถึงอรรถประโยชน์testdisk

วิธีการกู้คืนไฟล์ด้วย testdisk ได้รับการอธิบายอย่างดีในบทช่วยสอนนี้ ในการกู้คืนไฟล์ให้รันtestdisk /dev/sdXและเลือกประเภทตารางพาร์ติชันของคุณ หลังจากนี้เลือกแล้วเลือกพาร์ทิชันของคุณและเลือก[ Advanced ] Filesystem Utils [Undelete]ตอนนี้คุณสามารถเรียกดูและเลือกไฟล์ที่ถูกลบและคัดลอกไปยังตำแหน่งอื่นในระบบไฟล์


ไม่เห็น / dev / nvme0n1p2 ของฉัน
h22

6

ฉันมีปัญหาเดียวกันเมื่อสัปดาห์ที่แล้วและฉันลองใช้โปรแกรมมากมายเช่น debugfs, photorec, 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 มีฟังก์ชั่นยกเลิกการลบและทำงานกับระบบไฟล์ใด ๆ

แน่นอนว่าไม่ใช่วิธีแก้ปัญหาหากคุณลบไฟล์ของคุณด้วย "take no นักโทษ" rm: -}


1
ไม่ใช่คำตอบที่คุณพูดไปแล้ว แต่ขอบคุณที่แนะนำdel คำสั่ง
pylover

5

เชื่อมต่อไดรฟ์ผ่านอินเทอร์เฟซภายนอก

  1. ภูเขา
  2. umount /dev/{sd*}
  3. extundelete --restore-all /dev/{sd*}
  4. ผลไปที่โฟลเดอร์บ้านในไดรฟ์บูต
  5. คะแนนโบนัส: เขียน GUI สำหรับสิ่งนี้

ดูที่ลิงค์นี้สำหรับข้อมูลเพิ่มเติม: ยกเลิกการลบไฟล์เพียงแค่ลบบน ext4 กับ extundelete


2
Downvoters โปรดอธิบายว่าทำไมคุณคิดว่า extundelete ไม่ใช่ตัวเลือกที่ดี?
webminal.org

2
ดี! ขอบคุณสำหรับการโพสต์ extundelete เป็นเครื่องมือใหม่สำหรับฉัน ฉันใช้สิ่งนี้ในวันนี้และพบว่ามันมีประโยชน์มาก IMO ที่เป็นประโยชน์มากขึ้นกว่าคำตอบที่ยอมรับ สิ่งเดียวที่ฉันจะเพิ่มในคำตอบนี้เพื่อปรับปรุงเล็กน้อยคือ (1) เพื่อย้ำคำแนะนำในคำตอบอื่น ๆ ว่าควรปิดเครื่องคอมพิวเตอร์ที่ได้รับผลกระทบทันทีที่มีคนรู้ว่าไฟล์ถูกลบผิดและ (2) บูตจาก liveCD หรือ liveUSB OS เช่น Kali Linux ซึ่งรวมถึงยูทิลิตี้ extundelete (ฉันพบว่า liveCDs อื่น ๆ เช่น Debian Jessie ไม่รวมยูทิลิตี้นี้ในสื่อการติดตั้ง)
Osteoboon

4

เครื่องมือการกู้คืน - บรรทัดคำสั่ง:

เครื่องมือการกู้คืน - Gui:

ข่าวสาร:

จากประสบการณ์ส่วนตัวของฉันฉันได้รับข้อมูลกลับมาโดยใช้ ufs-explorer และ photorec

(1) = ไม่ใช่โอเพ่นซอร์สไม่ฟรี

(2) = ไม่ใช่โอเพ่นซอร์สฟรี

(3) = เปิดแหล่งที่มาและฟรี

(4) = มีการรองรับ ntfs

(5) = มีคุณสมบัติโครงสร้างไดเรกทอรี


1

ฉันไม่เห็นด้วยว่ามันเป็นไปไม่ได้ยากมากและฉันก็ไม่ได้ทำมันจาก Linux:

เมื่อไฟล์ถูกลบพวกเขาจะไม่ถูกลบจริง สิ่งที่เกิดขึ้นก็คือพื้นที่ที่อยู่ในฮาร์ดไดรฟ์นั้นจะถูกรีเซ็ตดังนั้นหากคอมพิวเตอร์พยายามเขียนข้อมูลที่นั่นก็ไม่มีอะไรบ่น โดยทั่วไปแล้วข้อมูลในฮาร์ดไดรฟ์ที่คุณคิดว่าคุณลบไปแล้วจะสามารถอยู่ได้ในอีกหนึ่งปีต่อมา หรืออย่างน้อยนี่คือประสบการณ์ของฉันในเครื่อง Windows ไม่ว่าจะทำงานในลักษณะเดียวกันจาก commandline บน Linux หรือไม่ฉันก็ไม่แน่ใจ แต่คุณอาจต้องการ Live CD แยกต่างหากเพื่อเปิดพาร์ติชันเช่นนั้นและไม่มีการรับประกันว่าไฟล์จะยังคงอยู่ที่นั่น ฉันทำสิ่งนี้บน windows xp หลายครั้งโดยใช้ Zero Assumption Recovery ฉันแน่ใจว่ามีเครื่องมือที่คล้ายกันถ้าคุณดูหนักพอ


ขึ้นอยู่กับสถานการณ์ที่อาจเป็นไปไม่ได้ 100% อาจหรือไม่อาจใช้งานได้ แต่คุณไม่เคยรับประกันใด ๆ
klutt

0

เมื่อคุณลบไฟล์ลิงค์จะนับในตาราง inode สำหรับไฟล์นั้นลดลงหนึ่งอัน ใน Unix เมื่อจำนวนลิงก์ลดลงเป็น 0 บล็อกข้อมูลสำหรับไฟล์นั้นจะถูกทำเครื่องหมายว่าว่างและโดยทั่วไปการอ้างอิงไปยังบล็อกข้อมูลเหล่านั้นจะหายไป ฉันเพิ่งค้นพบจากความเห็นของ @ fedorqui ว่าอาจมีวิธีเข้าถึงบล็อกเหล่านั้น แต่วิธีนี้ใช้ได้กับระบบไฟล์ ext3 เท่านั้น

วิธีหนึ่งในการเก็บรักษาไฟล์คือการเขียนฟังก์ชั่นที่จะช่วยให้คุณย้ายไฟล์ไปยังพื้นที่ถังขยะ (ให้เราพูด$HOME/.trash) และกู้คืนไฟล์ที่ต้องการจากที่นั่น rmฟังก์ชั่นนี้สามารถนามแฝง คุณสามารถกำหนดเวลางาน cron เพื่อลบไฟล์ที่อยู่ในพื้นที่ถังขยะเป็นเวลาหลายวัน


0

การทำเช่นนี้อาจช่วยให้คุณไม่สะดวก
หากคุณเคยใช้ gedit เพื่อแก้ไขไฟล์นั้นโดยค่าเริ่มต้นสำเนาของไฟล์นั้นจะถูกสร้างขึ้น
ตัวอย่างเช่นสมมติว่าเราลบ 'myfile.txt' โดยไม่ตั้งใจ
ในโฟลเดอร์ที่ใช้เก็บไฟล์ที่คุณเพิ่งลบใช้คำสั่งเหล่านี้และคุณจะกู้คืนสำเนาจากที่นั่น:
ls | grep 'myfile.txt~'
ด้วยโชคเล็กน้อยคุณจะพบมันแล้ว:
cp 'myfile.txt~' 'myfile.txt'
ฉันกู้คืนไฟล์ได้แล้วตอนนี้โดยใช้วิธีนี้ ขอให้โชคดี!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.