Leggi la fine del file per recuperare i dati


12

Un file .swp molto vecchio ha ripristinato un file che stavo modificando, quindi ora è significativamente più breve. Da allora non ho fatto nulla in quella directory, quindi i byte immediatamente successivi alla fine del file dovrebbero avere ancora i miei dati. Quale funzione posso usare per leggere N byte da un determinato indirizzo di memoria? dde readfermarsi ai confini dei file, a meno che non mi sia persa un'opzione da qualche parte.

La dimensione del file corrente è di 3,2 KB. Non ricordo esattamente quanto era grande il file prima che fosse troncato, ma probabilmente non più di 10 KB. Come posso leggere 10 KB dall'inizio del file, ignorando i limiti del file? Va bene se i dati non sono perfettamente conservati, purché non debba ricominciare da zero.

Risposte:


18

Di solito quando gli editor salvano i file, vengono eliminati o troncati su 0, liberando così spazio allocato e quindi scrivendo, che alloca nuovo spazio. Ciò comporta che il filesystem inserisca i dati in una posizione fisica completamente diversa. Quindi la tua idea potrebbe non funzionare.

È possibile ottenere la posizione fisica di un file utilizzando filefrago hdparm --fibmap, quindi utilizzare ddper leggere direttamente quella posizione fisica. Ho descritto questo processo in un contesto diverso qui: /unix//a/85880/30851


Nel tuo caso è più probabile che tu abbia bisogno dell'approccio generale per trovare dati testuali ... qualcosa come:

strings -n 12 -t d /dev/partition | grep -F 'text snippet'

strings cercherà dati ASCII consecutivi (supporta anche alcune altre codifiche, non sono sicuro di UTF-8. Se è codice o inglese non ne avrai bisogno) e stamperà anche l'offset in cui è stato trovato.

text snippetdovrebbe essere un esempio di testo esatto e unico che ricordi di essere nella parte del file che stai cercando [in una sola riga]. (Se non lo sai esattamente, puoi invece grep con espressioni regolari.)

-n 12è la lunghezza minima che stringscercherà. 12dovrebbe essere la lunghezza del tuo text snippet. Questo parametro è facoltativo, se fornito può aiutare strings | grepad andare un po 'più veloce.

Ci vorrà molto tempo per leggere l'intera partizione, ma in caso di successo, avrai un offset a cui puoi alimentare ddper afferrare l'area generale e quindi rimuovere elementi che non appartengono.

Da allora non ho fatto nulla in quella directory

Se la tua directory non è un mountpoint ... la maggior parte dei filesystem non riserva davvero spazio "per directory", quindi ... tutte le scritture nell'intero filesystem potrebbero sovrascrivere il bit che stai cercando. In una situazione di recupero dei dati, di solito si passa alla modalità di sola lettura.


Si noti che ogni file è archiviato in molti blocchi e di solito non vengono memorizzati in sequenza. Quindi stringsindividuerà solo alcune parti del file a meno che tu non sia estremamente fortunato.
Gilles 'SO- smetti di essere malvagio' il

3
Al contrario, dovresti essere estremamente sfortunato per trovare un file frammentato da 10 KB. Se trovi solo una parte, è più probabile che l'altra parte sia stata sovrascritta in questo caso. Ma a meno che tu non abbia molta attività di scrittura in quel file system, o sia un SSD con scarto istantaneo, se hai salvato quel file più volte durante la modifica, potresti trovare molte copie di quel file.
frostschutz,

3
Consiglierei strings -n16o una ragionevole lunghezza minima, per farlo andare più veloce.
Peter Cordes,

Buon punto, l'ho aggiunto alla risposta.
frostschutz,

4
Grazie mille. C'era solo immondizia appena oltre la fine del file, ma con stringsme sono stato in grado di trovare l'intero file altrove nella partizione. Sono quasi due mesi di lavoro di cui non devo occuparmi, e un eccellente promemoria per usare sempre il controllo della versione per qualcosa di importante.
Matthew Bedford,
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.