Unix / Linux silinmiş dosyaları silme / kurtarma


124

Silinen dosyaları kurtarmak / geri almak için bir komut var mı rm?

$ rm -rf /path/to/myfile

Nasıl iyileşebilirim myfile? Böyle bir araç varsa nasıl kullanabilirim?


1
cyberciti.biz/tips/… yardımcı olabilir. Ayrıca Stack Exchange'de daha iyidir .
fedorqui,

1. Bu Unix ve Linux için daha iyi olurdu 2. Yedeklemeler?

1
Herhangi bir şey yapmadan önce, verilerin üzerine yazılmadığından emin olmak için dosya sistemini salt okunur olarak bağlayın. Ayrıca, bu yazıya bir göz atın: superuser.com/questions/170857/ext4-undelete-utilities .

1
@EvanTeitelman, "salt okunur" un, salt okunurken dosyayı kurtarmayı denemekten daha iyi olduğunu mu kastediyorsunuz? Btw Midnight Commander (mc) yolu, anlaşılacağı umount datarecoverypros.com/recover-linux-midnightcommander.html
Kova Güç

1
En iyi çözüm, ileriyi düşünmek ve bir revizyon kontrol aracı kullanmaktır.
ctrl-alt-delor

Yanıtlar:


66

Yorumlarda birisinin verdiği bağlantı muhtemelen en iyi şansınız.

Linux debugfs Hack: Undelete Dosyaları

Bu korkutucu biraz korkutucu görünüyor olsa da takip etmek için oldukça yalındır. Genelde adımlar aşağıdaki gibidir:

  1. Bir dosya sistemi günlüğünü görüntülemek için debugfs kullanın.

    $ debugfs -w /dev/mapper/wks01-root
    
  2. Hata ayıklama isteminde

    debugfs: lsdel
    
  3. Örnek çıktı

    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. Komutu debugfs'ta çalıştırın

    debugfs: logdump -i <7536655>
    
  5. Inode dosyalarını belirle

    ...
    ...
    ....
    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. Yukarıdaki inode bilgisi ile aşağıdaki komutları çalıştırın

    # 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
    

Dosyalar kurtarıldı recovered.file.001.

Diğer seçenekler

Yukarıdakiler sizin için değilse photorec, geçmişte dosyaları kurtarmak gibi araçlar kullandım , ancak yalnızca resim dosyaları için tasarlandı. Blogumda bu yöntemi kapsamlı bir şekilde yazdım:

Fedora / CentOS / RHEL'deki Dijital Fotoğraf Makinesinin SDD Kartındaki Bozuk Jpeg ve mov Dosyalarının Nasıl Kurtarılacağı .


11
Denedim debugfs -w /dev/sdb2ama lsdelsais:0 deleted inodes found.
rubo77

5
kullanılarak extundeleteext3 / 4 için daha kolaydır ve muhtemelen aynı sonuçlara yol açacaktır.
eadmaster

1
bu işlem bir dosyayı kurtarmaya çalıştı ancak I @ y U T6 Ԝ * e 0 v' T 0 <#selinuxsystem_u: object_r: rpm_var_lib_t aldı: s0 } y U T6 ..... denemek conv = ascii, conv = ibm ve conv = ebcdic de aynı problemi sağlar
codyc4321

2
lsdel: Dosya sistemi açılmaz, nasıl çözülür?
Amitābha

3
Anladım Bunu /dev/mapper/wks01-root: No such file or directory while opening filesystemnereden aldın /dev/mapper/wks01-root?
Marko Avlijaš

29

Biraz şansım olsa, bazen bu komut dosyasıyla silinen dosyaları veya cevabındaki bir sonraki çözümü kurtarabilirim:

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

Başka kullanışlı hile vardır: Eğer, silinen dosyaları bir desen biliyorsanız tipi alt+ sys+ resuoyalnızca salt sonra canlı-cd ile kullanmak içinde + yeniden monte edilmesini yeniden başlatmak için grepsabit sürücüde arama yapmak için:

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

daha sonra /tmp/recoveryalnızca dosyalarınızdan önce olanları saklamak için düzenleyin .

Hey, eğer unix felsefesinde her şey dosya ise, bundan faydalanma zamanı gelmiştir, değil mi?


5
Sizin greptabanlı bir çözümdür çok akıllı ve hatta hala monte dosya sistemi ile, benim için çalıştı. Teşekkürler!
wchargin

Grep çözümünün sizin için nasıl çalıştığını anlamıyorum, sadece ikili verileri veriyor. Bu nasıl faydalı?
w00t

2
@ w00t Elbette, "sadece" ikili verileri tükürür. Ancak bazen bu ikili veriler, aradığım dosyaya karşılık gelen ASCII bitlerini içerir. Sanırım soruyu anlamadım.
wchargin

@ w00t hilesi, bu dosyaya çok özel bir arama düzeni kullanmaktır. Grep komutu, her bir eşleşme satırından önce ve sonra 500 satır alacaktır, bu nedenle yine de pek çok ilgisiz veriyi tükürecektir, ancak bununla başa çıkabilen bir metin editörü ile (örneğin Vim), iyiyi çözmek Kötü şeyler. Ayrıca, yazdırılamayan karakterleri olan tüm satırları başka bir grep komutuyla grep -av "[^[:print:]]"
akıtarak filtreleyebilirsiniz

grepBen yaptım: Çözüm Bir değişikliği benim için çalıştı sudo grep --line-buffered -ab "$PATTERN" /dev/sda1 | tee linesve (gibi bayt uzaklıklar var 123123123:line\n456456456:another\n...mi, sonra) n=1000; sudo dd of=before if=/dev/sda1 ibs=1 skip=$[123123123-$n] count=$nve n=1000; sudo dd of=after if=/dev/sda1 ibs=1 skip=123123123 count=$nfarklı olan ndeğerler.
Kirill Bulygin 5:17

21

Benim için işe yarayanlar kemer tarafından verildi (sadece metin dosyaları için geçerlidir):

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

/dev/sdXNkayıp dosyayı içeren bölüm nerede ( mountemin değilseniz kontrol edin ).

Biraz zaman alıyor, ancak henüz taahhütte bulunmadığım bazı kaynak kodlarını yanlışlıkla silerken çalıştı!


4
Programcılar için çok faydalı! genellikle kendi kodlarımızı hep kaybettik.
pylover

1
söyle bana, yanlışlıkla rm data/*.json python myFile.pyyerine koştumrm data/*.json && python myFile.py
William Becker

2
Teşekkürler dostum, geceleri 2 saat yazdığım bir metin dosyasını kurtarmama yardım ettin. PS /dev/sdXNdosya sistemi içindir, değil mi? Ben mayını buldumdf -T | awk '{print $1,$2,$NF}' | grep "^/dev"
Alex,

Ben sadece dosyanın ikilisini görüyorum. Normal biçime dönüştürmenin bir yolu var mı?
silgon

grep: conflicting matchers specified
Eylül’e

10

Bu soru çözülmüş ve birkaç yaşında olmasına rağmen, testdisk yardımcı programından bahsetmek istiyorum .

Testdisk ile dosyaların nasıl kurtarılacağı bu derste iyi açıklanmıştır . Dosyaları kurtarmak için çalıştırın testdisk /dev/sdXve bölüm tablosu türünüzü seçin. Bundan sonra, [ Advanced ] Filesystem Utilsseçiminizi yapın, ardından bölümünüzü seçin ve öğesini seçin [Undelete]. Artık silinen dosyaları arayabilir ve seçebilir ve bunları dosya sisteminizdeki başka bir yere kopyalayabilirsiniz.


Benim / dev / nvme0n1p2
h22

6

Geçen hafta aynı problemi yaşadım ve debugfs, photorec, ext3grep ve extundelete gibi birçok program denedim. ext3grep, dosyaları kurtarmak için en iyi programdı. Sözdizimi çok kolaydır:

ext3grep image.img --restore-all

veya:

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’

Bu video size yardımcı olabilecek küçük bir rehberdir.


6

Silmek delyerine alternatif kullanılıyor olabilir rm:

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

del silinmemiş bir işleve sahiptir ve herhangi bir dosya sistemiyle çalışır.

Elbette dosyalarınızı "mahkum almayın" ile silmişseniz bu bir çözüm değildir. Rm: -}


1
Söylediğin gibi bir cevap değil, del emirleri verdiğin için teşekkürler
pylover

5

sürücüyü harici arabirim üzerinden bağlayın

  1. dağ
  2. umount /dev/{sd*}
  3. extundelete --restore-all /dev/{sd*}
  4. sonuçları boot diskinde ana klasöre git
  5. bonus puanları: bunun için bir GUI yazın

Daha fazla bilgi için bu bağlantıya göz atın: ext4elete ile ext4'te silinmiş bir dosyayı silin .


2
Seçmenler, neden extundelete'ın iyi bir seçenek olmadığını düşünüyorsunuz?
webminal.org

2
Güzel! Gönderdiğiniz için teşekkür ederiz. extundelete benim için yeni bir araçtır. Bunu bugün kullandım ve çok faydalı buldum. IMO, kabul edilen cevaptan çok daha faydalı. Bu cevaba hafifçe iyileştirmek için ekleyeceğim tek şey (1) bazı diğer cevaplarda, dosyaların yanlışlıkla silindiğini fark ettiği anda etkilenen bilgisayarı kapatması gerektiğini söyleyen talimatları tekrarlamak ve (2) extundelete yardımcı programını içeren Kali Linux gibi bir liveCD veya liveUSB işletim sisteminden önyükleme (Debian Jessie gibi diğer birçok canlı CD'nin bu medyayı kendi kurulum ortamlarına dahil etmediğini öğrendim).
Osteoboon

4

Kurtarma Araçları - Komut Satırı:

Kurtarma Araçları - Gui:

Bilgiler:

Kişisel tecrübeme göre ufs-explorer ve photorec kullanarak verilerimi geri alıyorum

(1) = Açık kaynak değil, ücretsiz değil

(2) = Açık kaynak, ücretsiz

(3) = Açık kaynak ve ücretsiz

(4) = Ntfs desteği var

(5) = Dizin yapısı özelliği var


1

Bunun imkansız olduğunu, sadece çok çok zor olduğunu ve Linux'ta da hiç yapmadım:

Dosyalar silindiğinde, aslında silinmezler. Olan şey, sabit diskte bulundukları alanın bir tür sıfırlama olduğu, böylece bilgisayar orada veri yazmaya çalıştığında hiçbir şeyden şikayetçi olmaz. Genellikle, sabit diskinizdeki, sildiğiniz düşündüğünüz veriler neredeyse bir yıl sonra olabilir. Ya da en azından, bu bir Windows makinesindeki deneyimim. Linux'ta bir komut satırından aynı şekilde çalışıp çalışmadığı emin değilim, emin değilim, ancak böyle bir bölümü açmak için ayrı bir Canlı CD'ye ihtiyacınız olacak ve ayrıca dosyaların hala orada olduğundan emin değilsiniz. Bunu Windows XP'de birkaç kez Sıfır Varsayım Kurtarma kullanarak yaptım. Yeterince sert görünüyorsanız, benzer bir araç olduğundan eminim.


Duruma bağlı olarak% 100 imkansız olabilir. İşe ya da çalışmayabilir, ancak hiçbir zaman hiçbir garantiniz yoktur.
klutt,

0

Bir dosyayı sildiğinizde, o dosyanın inode tablosundaki bağlantı sayısı bir azalır. Unix'te, bağlantı sayısı 0'a düştüğünde, o dosyanın veri blokları serbest olarak işaretlenir ve tipik olarak, bu veri bloklarına referanslar kaybolur. @ Fedorqui'nin yorumundan bu bloklara erişmenin bir yolu olabileceğini ancak yalnızca ext3 dosya sistemine uygulanabilir olduğunu keşfettim.

Dosyaları korumanın bir yolu , dosyaları bir çöp kutusuna taşımanızı (söyleyelim $HOME/.trash) ve gerekli dosyaları oradan kurtarmanızı sağlayan bir işlev yazmaktır . Bu fonksiyona takma ad verilebilir rm. Çöp alanında bulunan dosyaları belirli bir süre boyunca silmek için bir cron işi zamanlayabilirsiniz.


0

Bu, bazılarınız için sıkıntıdan kurtarabilir.
Bu dosyayı düzenlemek için gedit kullandıysanız, varsayılan olarak bu dosyanın bir kopyası oluşturulur.
Örneğin, yanlışlıkla 'myfile.txt' dosyasını sildiğimizi varsayalım.
Az önce sildiğiniz dosyayı içeren klasörde bu komutları kullanın ve kopyasını oradan kurtarın:
ls | grep 'myfile.txt~'
Biraz şansla bulursunuz ve sonra:
cp 'myfile.txt~' 'myfile.txt'
Bu yöntemi kullanarak şu anda bir dosyayı kurtardım. İyi şanslar!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.