Unix / Linux stellt gelöschte Dateien wieder her

124

Gibt es einen Befehl zum Wiederherstellen / Wiederherstellen gelöschter Dateien durch rm?

$ rm -rf /path/to/myfile

Wie kann ich mich erholen myfile? Wenn es ein solches Tool gibt, wie kann ich es verwenden?

Pylover
quelle
1
cyberciti.biz/tips/… kann helfen. Auch im Stapelaustausch ist es besser .
Fedorqui
1. Dies wäre besser für Unix & Linux 2. Backups?
1
Bevor Sie etwas tun, hängen Sie das Dateisystem schreibgeschützt ein, um sicherzustellen, dass die Daten nicht überschrieben werden. Schauen Sie sich auch diesen Beitrag an: superuser.com/questions/170857/ext4-undelete-utilities .
1
@EvanTeitelman meinst du, schreibgeschütztes erneutes Einhängen ist besser, als zu versuchen, die Datei wiederherzustellen, während sie nicht eingehängt ist? Übrigens schlägt Midnightcommander (mc) vor, datarecoverypros.com/recover-linux-midnightcommander.html
Aquarius Power
1
Die beste Lösung ist, vorausschauend zu denken und ein Revisionstool zu verwenden.
Strg-Alt-Delor

Antworten:

66

Der in den Kommentaren angegebene Link ist wahrscheinlich Ihre beste Chance.

Linux debugfs Hack: Undelete Files

Diese Beschreibung, obwohl sie ein wenig einschüchternd aussieht, ist eigentlich ziemlich einfach zu folgen. Im Allgemeinen sind die Schritte wie folgt:

  1. Verwenden Sie debugfs, um ein Dateisystemprotokoll anzuzeigen

    $ debugfs -w /dev/mapper/wks01-root
    
  2. Bei der Eingabeaufforderung debugfs

    debugfs: lsdel
    
  3. Beispielausgabe

    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. Führen Sie den Befehl in debugfs aus

    debugfs: logdump -i <7536655>
    
  5. Bestimmen Sie den Inode der Dateien

    ...
    ...
    ....
    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. Führen Sie mit den obigen Inode-Informationen die folgenden Befehle aus

    # 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
    

Dateien wurden wiederhergestellt recovered.file.001.

Andere Optionen

Wenn dies nicht für Sie zutrifft, habe ich photorecin der Vergangenheit Tools zum Wiederherstellen von Dateien verwendet, diese sind jedoch nur für Bilddateien vorgesehen. Ich habe ausführlich über diese Methode in meinem Blog in diesem Artikel mit dem Titel geschrieben:

So stellen Sie beschädigte JPEG- und MOV-Dateien von der SDD-Karte einer Digitalkamera unter Fedora / CentOS / RHEL wieder her .

slm
quelle
11
Ich habe es mit versucht debugfs -w /dev/sdb2, lsdel0 deleted inodes found.
sagte
5
Die Verwendung extundeleteist für ext3 / 4 einfacher und würde wahrscheinlich zu den gleichen Ergebnissen führen.
eadmaster
1
Dies funktionierte, um eine Datei wiederherzustellen, aber ich erhielt @ y U T6 Ԝ * e 0 v' T 0 <#selinuxsystem_u: object_r: rpm_var_lib_t: s0 } y U T6 ..... Der Versuch von conv = ascii, conv = ibm und conv = ebcdic ergibt dasselbe Problem
codyc4321
2
lsdel: Dateisystem nicht geöffnet, wie man es löst?
Amitābha
3
Ich erhalte /dev/mapper/wks01-root: No such file or directory while opening filesystemWo hast du das /dev/mapper/wks01-roother?
Marko Avlijaš
29

Mit ein bisschen Wahrscheinlichkeit kann ich manchmal gelöschte Dateien mit diesem Skript oder der nächsten Lösung in der Antwort wiederherstellen:

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

Es gibt noch einen weiteren nützlichen Trick: Wenn Sie ein Muster in Ihren gelöschten Dateien kennen, geben Sie alt+ sys+ ein, resuoum neu zu starten und wieder einzuschalten. Verwenden Sie dann eine Live-CD, um grepauf der Festplatte zu suchen:

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

Bearbeiten Sie dann, /tmp/recoverum nur die vorherigen Dateien zu behalten.

Hey, wenn mit der Unix-Philosophie alles Dateien sind, ist es Zeit, dies auszunutzen, nein?

Gilles Quenot
quelle
5
Ihre grepbasierte Lösung ist sehr clever und hat bei mir funktioniert, auch wenn das Dateisystem noch eingehängt ist. Vielen Dank!
wchargin
Ich verstehe nicht, wie die grep-Lösung bei Ihnen funktioniert, sie gibt nur Binärdaten aus. Wie ist das sinnvoll?
15.
2
@w00t Klar, es spuckt "nur" Binärdaten aus. Manchmal enthalten diese Binärdaten jedoch die ASCII-Bits, die der gesuchten Datei entsprechen. Ich glaube, ich verstehe die Frage nicht?
wchargin
@ w00t Der Trick besteht darin, ein Suchmuster zu verwenden, das für diese Datei sehr spezifisch ist. Der Befehl grep nimmt die 500 Zeilen vor und nach jeder übereinstimmenden Zeile auf, spuckt also immer noch eine Menge irrelevanter Daten aus, aber mit einem Texteditor, der dies bewältigen kann (z. B. Vim), ist es einfach, die Ware auszusortieren das schlechte Zeug. Sie können auch alle Zeilen mit nicht grep -av "[^[:print:]]"
druckbaren
Die grepLösung funktionierte für mich mit einer Modifikation: Ich tat sudo grep --line-buffered -ab "$PATTERN" /dev/sda1 | tee linesund bekam Byte-Offsets (wie 123123123:line\n456456456:another\n...), dann tat n=1000; sudo dd of=before if=/dev/sda1 ibs=1 skip=$[123123123-$n] count=$nund n=1000; sudo dd of=after if=/dev/sda1 ibs=1 skip=123123123 count=$nmit unterschiedlichen nWerten.
Kirill Bulygin
21

Was für mich funktioniert hat, wurde von arch angegeben (gilt nur für Textdateien):

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

Wo /dev/sdXNbefindet sich die Partition, auf der sich die verlorene Datei befindet mount?

Dauert eine Weile, hat aber funktioniert, als ich versehentlich einen Quellcode gelöscht habe, den ich noch nicht festgeschrieben hatte!

William Becker
quelle
4
Sehr nützlich für Programmierer !. Normalerweise haben wir immer unsere eigenen Codes verloren.
Pylover
1
erzähl mir davon, ich bin versehentlich gelaufen rm data/*.json python myFile.pyanstattrm data/*.json && python myFile.py
William Becker
2
Danke, Kumpel, Sie haben mir gerade geholfen, eine Textdatei wiederherzustellen, die ich nachts 2 Stunden lang geschrieben habe. PS /dev/sdXNist für das Dateisystem, oder? Ich fand meine mitdf -T | awk '{print $1,$2,$NF}' | grep "^/dev"
Alex
Ich sehe nur die Binärdatei der Datei. Gibt es eine Möglichkeit, es in ein normales Format zu konvertieren?
Silgon
grep: conflicting matchers specified
25.
10

Obwohl diese Frage gelöst und einige Jahre alt ist, möchte ich das Dienstprogramm testdisk erwähnen .

Wie Sie Dateien mit testdisk wiederherstellen, erfahren Sie in diesem Tutorial . Führen testdisk /dev/sdXSie zum Wiederherstellen von Dateien den Partitionstabellentyp aus. Danach wählen Sie [ Advanced ] Filesystem Utils, dann wählen Sie Ihre Partition und wählen Sie [Undelete]. Jetzt können Sie gelöschte Dateien durchsuchen, auswählen und an einen anderen Speicherort in Ihrem Dateisystem kopieren.

S. Wilhelm
quelle
Mein / dev / nvme0n1p2
h22
6

Ich hatte letzte Woche das gleiche Problem und habe viele Programme ausprobiert, wie Debugfs, Photorec, Ext3Grep und Extundelete. ext3grep war das beste Programm, um Dateien wiederherzustellen. Die Syntax ist sehr einfach:

ext3grep image.img --restore-all

oder:

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’

Dieses Video ist ein Mini-Tutorial, das Ihnen helfen kann.

Juan
quelle
6

Eine Alternative kann delanstelle von rmzum Löschen verwendet werden:

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

del hat eine Wiederherstellungsfunktion und funktioniert mit jedem Dateisystem.

Natürlich ist es keine Lösung, wenn Sie Ihre Dateien bereits mit "take no prisoners" gelöscht haben. Rm: -}

Framstag
quelle
1
Keine Antwort, wie Sie bereits gesagt haben, aber danke, dass Sie den del Befehl eingeführt haben.
Pylover
5

Laufwerk über externe Schnittstelle anschließen

  1. montieren
  2. umount /dev/{sd*}
  3. extundelete --restore-all /dev/{sd*}
  4. Ergebnisse werden in den Ausgangsordner auf dem Startlaufwerk verschoben
  5. Bonuspunkte: Schreiben Sie eine GUI dafür

Weitere Informationen finden Sie unter diesem Link: Wiederherstellen einer gerade gelöschten Datei auf ext4 mit extundelete .

GRZ
quelle
2
Downvoter, erklären Sie bitte, warum Sie denken, dass Extundelete keine gute Option ist.
webminal.org
2
Nett! Danke fürs Schreiben. Extundelete ist ein neues Tool für mich. Ich habe das heute benutzt und fand es sehr hilfreich. Viel hilfreicheres IMO als die akzeptierte Antwort. Die einzigen Dinge, die ich zu dieser Antwort hinzufügen würde, um sie ein wenig zu verbessern, sind (1) die Anweisungen in einigen anderen Antworten zu wiederholen, dass man den betroffenen Computer ausschalten sollte, sobald man merkt, dass die Dateien versehentlich gelöscht wurden, und (2) um Booten Sie von einer Live-CD oder einem Live-USB-Betriebssystem wie Kali Linux, das das Dienstprogramm Extundelete enthält (ich habe festgestellt, dass viele andere Live-CDs wie Debian Jessie dieses Dienstprogramm nicht auf ihren Installationsmedien enthalten).
Osteoboon
4

Wiederherstellungstools - Befehlszeile:

Wiederherstellungstools - GUI:

Infos:

Nach meiner persönlichen Erfahrung bekomme ich meine Daten mit ufs-explorer und photorec zurück

(1) = Nicht Open Source, nicht frei

(2) = Nicht Open Source, kostenlos

(3) = Open Source und kostenlos

(4) = Habe ntfs Unterstützung

(5) = Verfügt über eine Verzeichnisstrukturfunktion

intika
quelle
1

Ich bin nicht einverstanden, dass es unmöglich ist, nur sehr, sehr schwierig, und ich habe es noch nie unter Linux gemacht:

Wenn Dateien gelöscht werden, werden sie tatsächlich nicht gelöscht. Was passiert ist, dass der Speicherplatz, den sie auf der Festplatte hatten, sozusagen zurückgesetzt wird, dass sich nichts beschwert, wenn der Computer versucht, Daten dort zu schreiben. Im Allgemeinen können die Daten auf Ihrer Festplatte, von denen Sie dachten, dass Sie sie gelöscht haben, fast ein Jahr später dort sein. Zumindest ist dies meine Erfahrung auf einem Windows-Computer. Ich bin mir nicht sicher, ob es unter Linux auf die gleiche Weise wie unter einer Befehlszeile funktioniert, aber Sie benötigen wahrscheinlich eine separate Live-CD, um die Partition so zu öffnen, und es gibt auch keine Garantie dafür, dass die Dateien noch vorhanden sind. Ich habe dies unter Windows XP mehrere Male mit Zero Assumption Recovery durchgeführt. Ich bin mir sicher, dass es ein ähnliches Tool gibt, wenn Sie genau hinsehen.

Roguebantha
quelle
Je nach Situation kann es 100% unmöglich sein. Es kann funktionieren oder nicht, aber Sie haben NIE Garantien.
klutt
0

Wenn Sie eine Datei löschen, wird die Anzahl der Verknüpfungen in der Inode-Tabelle für diese Datei um eins verringert. Unter Unix werden die Datenblöcke für diese Datei als frei markiert, wenn die Anzahl der Verknüpfungen auf 0 abfällt. In der Regel gehen Verweise auf diese Datenblöcke verloren. Ich habe gerade aus dem Kommentar von @ fedorqui herausgefunden, dass es eine Möglichkeit gibt, auf diese Blöcke zuzugreifen, aber das gilt nur für das ext3-Dateisystem.

Eine Möglichkeit , die Dateien erhalten wird , eine Funktion zu schreiben , die es Ihnen erlaubt, zu bewegen die Dateien in einem ungenutzten Bereich (sagen wir $HOME/.trash) und erholen sie die benötigten Dateien von dort aus . Diese Funktion kann mit Alias ​​versehen werden rm. Sie können einen Cron-Job einplanen, um die Dateien zu löschen, die sich für eine bestimmte Anzahl von Tagen im Papierkorb befunden haben.

entmutigen
quelle
0

Dies könnte einigen von Ihnen die Mühe ersparen.
Wenn Sie diese Datei mit gedit bearbeitet haben, wird standardmäßig eine Kopie dieser Datei erstellt.
Nehmen wir zum Beispiel an, wir haben 'myfile.txt' versehentlich gelöscht.
In dem Ordner, der die Datei enthielt, die Sie gerade gelöscht haben, verwenden Sie diese Befehle und Sie werden die Kopie von dort wiederherstellen:
ls | grep 'myfile.txt~'
Mit ein bisschen Glück werden Sie sie finden und dann:
cp 'myfile.txt~' 'myfile.txt'
Ich habe gerade eine Datei mit dieser Methode wiederhergestellt. Viel Glück!

ntt
quelle