Unix / Linux membatalkan penghapusan / memulihkan file yang dihapus

124

Apakah ada perintah untuk memulihkan / membatalkan penghapusan file yang dihapus rm?

$ rm -rf /path/to/myfile

Bagaimana saya bisa sembuh myfile? Jika ada alat seperti itu, bagaimana saya bisa menggunakannya?

piring
sumber
1
cyberciti.biz/tips/… dapat membantu. Juga lebih baik di Stack Exchange .
fedorqui
1. Ini akan lebih baik untuk Unix & Linux 2. Backup?
1
Sebelum Anda melakukan apa pun, pasang sistem file read-only untuk memastikan data tidak ditimpa. Juga, lihat posting ini: superuser.com/questions/170857/ext4-undelete-utilities .
1
@EvanTeitelman yang Anda maksud remount hanya-baca lebih baik daripada mencoba memulihkan file ketika sedang di-umount? btw, midnightcommander (mc) way, menyarankan umounting datarecoverypros.com/recover-linux-midnightcommander.html
Aquarius Power
1
Solusi terbaik adalah berpikir ke depan dan menggunakan alat kontrol revisi.
ctrl-alt-delor

Jawaban:

66

Tautan yang diberikan seseorang dalam komentar adalah peluang terbaik Anda.

Linux debugfs Hack: Membatalkan Penghapusan File

Tulisan itu meskipun tampak sedikit mengintimidasi sebenarnya cukup mudah untuk diikuti. Secara umum langkah-langkahnya adalah sebagai berikut:

  1. Gunakan debugfs untuk melihat log filesystem

    $ debugfs -w /dev/mapper/wks01-root
    
  2. Pada prompt debugfs

    debugfs: lsdel
    
  3. Output sampel

    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. Jalankan perintah dalam debugfs

    debugfs: logdump -i <7536655>
    
  5. Tentukan file 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. Dengan info inode di atas, jalankan perintah berikut

    # 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
    

File telah dipulihkan ke recovered.file.001.

Pilihan lain

Jika di atas bukan untuk Anda, saya telah menggunakan alat seperti photorecuntuk memulihkan file di masa lalu, tetapi itu ditujukan untuk file gambar saja. Saya telah menulis tentang metode ini secara ekstensif di blog saya di artikel berjudul:

Cara Memulihkan jpeg yang rusak dan memindah File dari Kartu SDD Kamera Digital pada Fedora / CentOS / RHEL .

slm
sumber
11
Saya mencoba dengan debugfs -w /dev/sdb2tetapi lsdelsais:0 deleted inodes found.
rubo77
5
menggunakan extundeletelebih mudah untuk ext3 / 4 dan mungkin akan mengarah pada hasil yang sama.
eadmaster
1
ini berfungsi untuk memulihkan file, tetapi saya menerima @ y U T6 Ԝ * e 0 v' T 0 <#selinuxsystem_u: object_r: rpm_var_lib_t: s0 } y U T6 ..... mencoba conv = ascii, conv = ibm, dan conv = ebcdic menghasilkan masalah yang sama
codyc4321
2
lsdel: Filesystem tidak terbuka, bagaimana mengatasinya?
Amitābha
3
Saya dapat dari /dev/mapper/wks01-root: No such file or directory while opening filesystemmana Anda mendapatkan ini /dev/mapper/wks01-root?
Marko Avlijaš
29

Dengan sedikit peluang, kadang-kadang saya dapat memulihkan file yang dihapus dengan skrip ini atau solusi berikutnya dalam jawabannya:

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

Ada trik lain yang bermanfaat: jika Anda tahu pola dalam file yang dihapus, ketik alt+ sys+ resuountuk mem-boot ulang + remount dalam read-only, kemudian dengan live-cd, gunakan grepuntuk mencari di hard-drive:

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

lalu edit /tmp/recoveruntuk menyimpan hanya apa file Anda sebelumnya.

Hei, jika dengan filosofi unix semua adalah file, saatnya mengambil keuntungan dari ini, bukan?

Gilles Quenot
sumber
5
grepSolusi berbasis Anda sangat pintar dan bekerja untuk saya, bahkan dengan sistem file yang masih terpasang. Terima kasih!
wchargin
Saya tidak mengerti bagaimana solusi grep bekerja untuk Anda, hanya menghasilkan data biner. Bagaimana itu bermanfaat?
w00t
2
@ w00t Tentu, itu "hanya" memuntahkan data biner. Tapi terkadang data biner itu mengandung bit ASCII yang sesuai dengan file yang saya cari. Saya kira saya tidak mengerti pertanyaannya?
wchargin
@ w00t triknya adalah menggunakan pola pencarian yang sangat spesifik untuk file itu. Perintah grep akan mengambil 500 baris sebelum dan setelah setiap baris yang cocok, sehingga masih akan memuntahkan banyak data yang tidak relevan, tetapi dengan editor teks yang dapat mengatasinya (misalnya Vim), mudah untuk memilah yang baik dari hal-hal buruk. Anda juga dapat memfilter semua baris dengan karakter yang tidak dapat grep -av "[^[:print:]]"
dicetak dengan mem
The grepsolusi bekerja untuk saya dengan modifikasi: saya lakukan sudo grep --line-buffered -ab "$PATTERN" /dev/sda1 | tee linesdan mendapat offset byte (seperti 123123123:line\n456456456:another\n...), kemudian melakukan n=1000; sudo dd of=before if=/dev/sda1 ibs=1 skip=$[123123123-$n] count=$ndan n=1000; sudo dd of=after if=/dev/sda1 ibs=1 skip=123123123 count=$nberbeda dengan nnilai-nilai.
Kirill Bulygin
21

Apa yang berhasil untuk saya diberikan oleh arch (hanya berlaku untuk file teks):

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

di mana /dev/sdXNpartisi berisi file yang hilang (tanyakan mountjika tidak yakin).

Butuh sedikit waktu, tetapi berhasil ketika saya secara tidak sengaja menghapus beberapa kode sumber yang belum saya komit!

William Becker
sumber
4
Sangat berguna untuk programmer !. biasanya, kami selalu kehilangan kode kami sendiri.
pylover
1
memberitahu saya tentang hal itu, saya sengaja berlari rm data/*.json python myFile.pybukanrm data/*.json && python myFile.py
William Becker
2
Terima kasih sobat, Anda baru saja membantu saya memulihkan file teks yang saya habiskan 2 jam menulis di malam hari. PS /dev/sdXNuntuk sistem file, kan? Saya menemukan milik saya dengandf -T | awk '{print $1,$2,$NF}' | grep "^/dev"
Alex
Saya hanya melihat biner file. Apakah ada cara untuk mengubahnya ke format normal?
silgon
grep: conflicting matchers specified
felwithe
10

Meskipun Pertanyaan ini sudah terpecahkan dan berumur beberapa tahun, saya ingin menyebutkan utilitas testdisk .

Cara memulihkan file dengan testdisk dijelaskan dengan baik dalam tutorial ini . Untuk memulihkan file, jalankan testdisk /dev/sdXdan pilih jenis tabel partisi Anda. Setelah ini, pilih [ Advanced ] Filesystem Utils, lalu pilih partisi Anda dan pilih [Undelete]. Sekarang Anda dapat menelusuri dan memilih file yang dihapus dan menyalinnya ke lokasi lain di sistem file Anda.

S. Wilhelm
sumber
Tidak melihat / dev / nvme0n1p2 saya
h22
6

Saya memiliki masalah yang sama minggu lalu dan saya mencoba banyak program, seperti debugfs, photorec, ext3grep dan extundelete. ext3grep adalah program terbaik untuk memulihkan file. Sintaksnya sangat mudah:

ext3grep image.img --restore-all

atau:

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 ini adalah tutorial mini yang dapat membantu Anda.

Juan
sumber
6

Alternatif mungkin menggunakan delalih-alih rmuntuk menghapus:

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

del memiliki fungsi hapus dan bekerja dengan sistem file apa pun.

Tentu saja itu bukan solusi jika Anda sudah menghapus file Anda dengan "take no prisones" rm: -}

Framstag
sumber
1
Bukan jawaban seperti yang telah Anda katakan, tetapi terima kasih telah memperkenalkan del perintah.
pylover
5

menghubungkan drive melalui antarmuka eksternal

  1. meningkat
  2. umount /dev/{sd*}
  3. extundelete --restore-all /dev/{sd*}
  4. hasil masuk ke folder rumah pada boot drive
  5. poin bonus: tulis GUI untuk ini

Lihat tautan ini untuk info lebih lanjut: batalkan penghapusan file yang baru saja dihapus di ext4 dengan extundelete .

GRZ
sumber
2
Para downvoter, tolong jelaskan mengapa menurut Anda ekstundelete bukanlah pilihan yang baik?
webminal.org
2
Bagus! Terima kasih sudah memposting. extundelete adalah alat baru untuk saya. Saya menggunakan ini hari ini dan merasa sangat membantu. IMO jauh lebih bermanfaat daripada jawaban yang diterima. Satu-satunya hal yang akan saya tambahkan ke jawaban ini untuk memperbaikinya sedikit adalah (1) untuk mengulangi instruksi dalam beberapa jawaban lain bahwa seseorang harus mematikan komputer yang terpengaruh segera setelah orang menyadari bahwa file-file itu secara tidak sengaja dihapus, dan (2) untuk boot dari liveCD atau liveUSB OS seperti Kali Linux yang menyertakan utilitas ekstundelete (saya menemukan bahwa banyak liveCD lain seperti Debian Jessie tidak menyertakan utilitas ini pada media instal mereka).
Osteoboon
4

Alat Pemulihan - Baris Perintah:

Alat Pemulihan - Gui:

Informasi :

Dalam pengalaman pribadi saya, saya mendapatkan data saya kembali menggunakan ufs-explorer dan photorec

(1) = Tidak open source, tidak gratis

(2) = Tidak open source, gratis

(3) = Sumber terbuka dan gratis

(4) = Miliki dukungan ntfs

(5) = Memiliki fitur struktur direktori

intika
sumber
1

Saya tidak setuju bahwa itu tidak mungkin, hanya sangat sangat sulit, dan saya juga tidak pernah melakukannya di Linux:

Ketika file dihapus, mereka sebenarnya tidak dihapus. Apa yang terjadi adalah bahwa ruang yang ada di hard-drive semacam reset, sehingga jika komputer mencoba menulis data di sana, tidak ada yang mengeluh. Secara umum, data pada hard drive yang Anda pikir Anda hapus dapat berada di sana hampir setahun kemudian. Atau setidaknya, ini pengalaman saya di mesin Windows. Apakah itu bekerja dengan cara yang sama dari commandline di Linux, saya tidak yakin, tetapi Anda mungkin akan membutuhkan Live CD terpisah untuk membuka partisi seperti itu, dan juga tidak ada jaminan file-file itu masih ada. Saya telah melakukan ini pada windows xp beberapa kali menggunakan Zero Assumption Recovery. Saya yakin ada alat serupa di sekitar jika Anda terlihat cukup keras.

Roguebantha
sumber
Tergantung pada situasinya mungkin 100% mustahil. Ini mungkin atau mungkin tidak berfungsi, tetapi Anda TIDAK PERNAH memiliki jaminan apa pun.
klutt
0

Saat Anda menghapus file, jumlah tautan dalam tabel inode untuk file itu berkurang satu. Di Unix, ketika jumlah tautan turun ke 0, blok data untuk file itu ditandai sebagai bebas dan biasanya, referensi ke blok data tersebut hilang. Saya baru saja menemukan dari komentar @ fedorqui bahwa mungkin ada beberapa cara untuk mengakses blok-blok itu tetapi itu hanya berlaku untuk sistem file ext3.

Salah satu cara untuk melestarikan file adalah dengan menulis fungsi yang memungkinkan Anda memindahkan file ke area sampah (katakanlah $HOME/.trash) dan memulihkan file yang diperlukan dari sana. Fungsi ini dapat alias rm. Anda dapat menjadwalkan tugas cron untuk menghapus file yang telah ada di area sampah selama beberapa hari tertentu.

unxnut
sumber
0

Ini mungkin menghemat masalah bagi sebagian dari Anda.
Jika Anda pernah menggunakan gedit untuk mengedit file itu, secara default salinan file itu akan dibuat.
Misalnya, misalkan kita telah menghapus 'myfile.txt' secara tidak sengaja.
Dalam folder yang berisi file yang baru saja Anda hapus, gunakan perintah ini dan Anda akan memulihkan salinannya dari sana:
ls | grep 'myfile.txt~'
Dengan sedikit keberuntungan Anda akan menemukannya dan kemudian:
cp 'myfile.txt~' 'myfile.txt'
Saya telah memulihkan file yang sekarang menggunakan metode ini. Semoga berhasil!

ntt
sumber