Unix / Linux ripristina / ripristina i file eliminati


124

Esiste un comando per ripristinare / ripristinare i file eliminati rm?

$ rm -rf /path/to/myfile

Come posso recuperare myfile? Se esiste un tale strumento, come posso usarlo?


1
cyberciti.biz/tips/… può aiutare. Inoltre è meglio in Stack Exchange .
fedorqui,

1. Questo sarebbe meglio per Unix e Linux 2. Backup?

1
Prima di fare qualsiasi cosa, monta il filesystem in sola lettura per assicurarti che i dati non vengano sovrascritti. Inoltre, dai un'occhiata a questo post: superuser.com/questions/170857/ext4-undelete-utilities .

1
@EvanTeitelman vuoi dire che rimontare in sola lettura è meglio che provare a recuperare il file mentre è smontato? btw, Midnight Commander (mc) A proposito, suggerisce umounting datarecoverypros.com/recover-linux-midnightcommander.html
Acquario Potenza

1
La soluzione migliore è pensare in anticipo e utilizzare uno strumento di controllo delle revisioni.
ctrl-alt-delor,

Risposte:


66

Il link che qualcuno ha fornito nei commenti è probabilmente la tua migliore possibilità.

Debug di Linux Hack: Undelete Files

Quella sceneggiatura, sebbene un po 'intimidatoria, è in realtà abbastanza semplice da seguire. In generale i passaggi sono i seguenti:

  1. Utilizzare debugfs per visualizzare un registro di filesystem

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

    debugfs: lsdel
    
  3. Uscita campione

    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. Esegui il comando in debugfs

    debugfs: logdump -i <7536655>
    
  5. Determina l'inode dei file

    ...
    ...
    ....
    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. Con le informazioni sull'inode sopra riportate esegui i seguenti comandi

    # 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 ripristinati in recovered.file.001.

Altre opzioni

Se quanto sopra non fa per te, ho usato strumenti come photorecrecuperare i file in passato, ma è orientato solo per i file di immagini. Ho scritto ampiamente di questo metodo sul mio blog in questo articolo intitolato:

Come recuperare file jpeg e mov corrotti dalla scheda SDD di una fotocamera digitale su Fedora / CentOS / RHEL .


11
Ci ho provato debugfs -w /dev/sdb2ma lsdel0 deleted inodes found.
dice

5
l'uso extundeleteè più facile per ext3 / 4 e probabilmente porterebbe agli stessi risultati.
eadmaster il

1
questo ha funzionato per recuperare un file, ma ho ricevuto @ y U T6 Ԝ * e 0 v' T 0 <#selinuxsystem_u: object_r: rpm_var_lib_t: s0 } y U T6 ..... provare conv = ascii, conv = ibm e conv = ebcdic produce lo stesso problema
codyc4321

2
lsdel: filesystem non aperto, come risolverlo?
Amitābha,

3
Ho capito Da /dev/mapper/wks01-root: No such file or directory while opening filesystemdove l'hai preso /dev/mapper/wks01-root?
Marko Avlijaš,

29

Con un po 'di possibilità, a volte posso recuperare file cancellati con questo script o la prossima soluzione nella risposta:

#!/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'è un altro trucco utile: se conosci un modello nei tuoi file eliminati, digita alt+ sys+ resuoper riavviare + rimontare in sola lettura, quindi con un cd live, usa grepper cercare nel disco rigido:

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

quindi modifica /tmp/recoverper conservare solo i file precedenti.

Ehi, se con la filosofia unix sono tutti file, è tempo di approfittare di questo, no?


5
La tua grepsoluzione di base è molto intelligente e ha funzionato per me, anche con il file system ancora montato. Grazie!
mercoledì

Non capisco come la soluzione grep ha funzionato per te, produce solo dati binari. Quanto è utile?
wg

2
@ w00t Certo, "solo" sputa i dati binari. Ma a volte quei dati binari contengono i bit ASCII corrispondenti al file che sto cercando. Immagino di non capire la domanda?
wchargin,

@ w00t il trucco è usare un modello di ricerca molto specifico per quel file. Il comando grep prenderà le 500 righe prima e dopo ogni riga corrispondente, quindi sputerà ancora molti dati irrilevanti, ma con un editor di testo in grado di farcela (ad esempio Vim), è facile risolvere il problema da le cose cattive. Puoi anche filtrare tutte le righe con caratteri non stampabili grep -av "[^[:print:]]"
eseguendo il

La grepsoluzione ha funzionato per me con una modifica: ho fatto sudo grep --line-buffered -ab "$PATTERN" /dev/sda1 | tee linese ottenuto offset di byte (come 123123123:line\n456456456:another\n...), quindi fatto n=1000; sudo dd of=before if=/dev/sda1 ibs=1 skip=$[123123123-$n] count=$ne n=1000; sudo dd of=after if=/dev/sda1 ibs=1 skip=123123123 count=$ncon nvalori diversi .
Kirill Bulygin,

21

Ciò che ha funzionato per me è stato dato da arch (vale solo per i file di testo):

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

dove si /dev/sdXNtrova la partizione contenente il file perso (verificare con mountse non si è sicuri).

Richiede un po 'di tempo, ma ha funzionato quando ho eliminato accidentalmente un codice sorgente che non avevo ancora commesso!


4
Molto utile per i programmatori !. di solito, abbiamo sempre perso i nostri codici.
pylover,

1
raccontamelo, ho corso per caso rm data/*.json python myFile.pyinvece dirm data/*.json && python myFile.py
William Becker, il

2
Grazie amico, mi hai appena aiutato a recuperare un file di testo che ho passato 2 ore a scrivere di notte. PS /dev/sdXNè per il file system, giusto? Ho trovato il mio condf -T | awk '{print $1,$2,$NF}' | grep "^/dev"
Alex,

Vedo solo il file binario del file. C'è un modo per convertirlo nel formato normale?
silgon,

grep: conflicting matchers specified
felwithe

10

Sebbene questa domanda sia risolta e vecchia di alcuni anni, voglio menzionare l' utilità testdisk .

Come recuperare file con testdisk è spiegato bene in questo tutorial . Per recuperare i file, esegui testdisk /dev/sdXe seleziona il tipo di tabella delle partizioni. Successivamente, selezionare [ Advanced ] Filesystem Utils, quindi selezionare la partizione e selezionare [Undelete]. Ora puoi sfogliare e selezionare i file eliminati e copiarli in un'altra posizione nel tuo filesystem.


Non vede il mio / dev / nvme0n1p2
h22 il

6

Ho avuto lo stesso problema la scorsa settimana e ho provato molti programmi, come debugfs, photorec, ext3grep ed extundelete. ext3grep era il miglior programma per recuperare file. La sintassi è molto semplice:

ext3grep image.img --restore-all

o:

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’

Questo video è un mini tutorial che può aiutarti.


6

È possibile utilizzare un'alternativa delanziché rmper eliminare:

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

del ha una funzione di ripristino e funziona con qualsiasi file system.

Ovviamente non è una soluzione se hai già cancellato i tuoi file con "non prendere prigionieri" rm: -}


1
Non una risposta come hai già detto, ma grazie per aver introdotto il del comando.
pylover,

5

collegare l'unità tramite interfaccia esterna

  1. montare
  2. umount /dev/{sd*}
  3. extundelete --restore-all /dev/{sd*}
  4. i risultati vanno alla cartella principale sull'unità di avvio
  5. punti bonus: scrivi una GUI per questo

Vedi questo link per maggiori informazioni: ripristinare un file appena eliminato su ext4 con extundelete .


2
Downvoter, per favore spiega perché pensi che extundelete non sia una buona opzione?
webminal.org l'

2
Bello! Grazie per la pubblicazione. extundelete è un nuovo strumento per me. L'ho usato oggi e l'ho trovato estremamente utile. IMO molto più utile della risposta accettata. Le uniche cose che aggiungerei a questa risposta per migliorarla leggermente sono (1) ribadire le istruzioni in alcune altre risposte che si dovrebbe spegnere il computer interessato non appena ci si rende conto che i file sono stati cancellati per errore, e (2) per avviare da un liveCD o un sistema operativo liveUSB come Kali Linux che include l'utilità extundelete (ho scoperto che molti altri liveCD come Debian Jessie non includono questa utilità nel loro supporto di installazione).
Osteoboon,

4

Strumenti di recupero - Riga di comando:

Strumenti di recupero - Gui:

Informazioni:

Nella mia esperienza personale ho recuperato i miei dati usando ufs-explorer e photorec

(1) = Non open source, non gratuito

(2) = Non open source, gratuito

(3) = Open source e gratuito

(4) = Supporto per NTFS

(5) = Funzione di struttura delle directory


1

Non sono d'accordo sul fatto che sia impossibile, solo molto molto difficile, e non l'ho mai fatto su Linux:

Quando i file vengono eliminati, non vengono effettivamente eliminati. Quello che succede è che lo spazio che si trovavano sul disco rigido è una sorta di reset, quindi se il computer tenta di scrivere dati lì, nulla si lamenta. In genere, i dati sul disco rigido che pensavi di aver eliminato possono essere presenti quasi un anno dopo. O almeno, questa è la mia esperienza su un computer Windows. Che funzioni o meno allo stesso modo da una riga di comando su Linux, non sono sicuro, ma probabilmente avresti bisogno di un Live CD separato per aprire la partizione in quel modo, e non c'è nemmeno alcuna garanzia che i file siano ancora lì. L'ho fatto su Windows XP più volte usando Zero Assumption Recovery. Sono sicuro che c'è uno strumento simile in giro se guardi abbastanza forte.


A seconda della situazione, potrebbe essere impossibile al 100%. Potrebbe funzionare o meno, ma non hai MAI alcuna garanzia.
Klut,

0

Quando si elimina un file, il conteggio dei collegamenti nella tabella degli inode per quel file viene ridotto di uno. In Unix, quando il conteggio dei collegamenti scende a 0, i blocchi di dati per quel file vengono contrassegnati come liberi e, in genere, i riferimenti a tali blocchi di dati vengono persi. Ho appena scoperto dal commento di @ fedorqui che potrebbe esserci un modo per accedere a quei blocchi ma che è applicabile solo al filesystem ext3.

Un modo per preservare i file sarà quello di scrivere una funzione che ti permetta di spostare i file in un'area cestino (diciamo così $HOME/.trash) e recuperare i file necessari da lì. Questa funzione può essere modificata rm. È possibile pianificare un processo cron per eliminare i file che sono stati nell'area cestino per un certo numero di giorni.


0

Questo potrebbe salvare il problema per alcuni di voi.
Se hai mai usato gedit per modificare quel file, per impostazione predefinita verrà creata una copia di quel file.
Ad esempio supponiamo di aver accidentalmente eliminato "myfile.txt".
Nella cartella che un tempo conteneva il file che hai appena cancellato usa questi comandi e da lì recupererai la copia:
ls | grep 'myfile.txt~'
Con un po 'di fortuna lo troverai e poi:
cp 'myfile.txt~' 'myfile.txt'
Ho recuperato un file proprio ora usando questo metodo. Buona fortuna!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.