Verileri kurtarmak için dosyanın sonunu okuyun


12

Çok eski bir .swp dosyası, düzenlemekte olduğum bir dosyayı geri döndürdü, bu yüzden artık önemli ölçüde daha kısa. O dizinden beri hiçbir şey yapmadım, bu yüzden dosyanın sonundan hemen sonra gelen baytlar hala verilerime sahip olmalı. Belirli bir bellek adresinden N bayt okumak için hangi işlevi kullanabilirim? ddve readbir yerde bir seçeneği kaçırmadıkça, dosya sınırlarında durun.

Geçerli dosya boyutu 3,2 KB'dir. Dosyanın kesilmeden önce ne kadar büyük olduğunu hatırlamıyorum, ancak muhtemelen 10 KB'den fazla değil. Dosya sınırlarını yoksayarak dosyanın başlangıcından nasıl 10 KB okuyabilirim? Sıfırdan başlamak zorunda olmadığım sürece verilerin mükemmel şekilde korunmaması iyi olur.

Yanıtlar:


18

Genellikle editörler dosyaları kaydettiğinde, 0'ı siler veya kısaltırlar, böylece ayrılan alanı boşaltırlar ve daha sonra yeni alan tahsis ederler. Bu, dosya sisteminin verileri tamamen farklı bir fiziksel konuma koymasını sağlar. Yani fikriniz işe yaramayabilir.

Sen kullanarak bir dosyanın fiziksel konumunu alabilir filefragveya hdparm --fibmap, sonra kullanmak dddoğrudan o fiziksel konumu okumak için. Bu işlemi burada farklı bir bağlamda açıkladım: /unix//a/85880/30851


Sizin durumunuzda, metin verilerini bulmak için genel yaklaşıma ihtiyacınız vardır ...

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

strings ardışık ASCII verilerini arayacaktır (UTF-8'den emin olmayan diğer kodlamaları da destekler. Kod veya İngilizce ise buna ihtiyacınız olmayacak) ve aynı zamanda ofseti bulunduğu yere de basacaktır.

text snippetaradığınız dosyanın [tek bir satırda] parçası olduğunu hatırladığınız tam ve benzersiz bir metin örneği olmalıdır. (Tam olarak bilmiyorsanız, bunun yerine normal ifadelerle grep olabilirsiniz.)

-n 12aranacak minimum uzunluktur strings. 12uzunluğunuz olmalıdır text snippet. Bu parametre isteğe bağlıdır, eğer sağlanırsa strings | grepbiraz daha hızlı gitmeye yardımcı olabilir .

Tüm bölümü okumak uzun zaman alacaktır, ancak başarılı olursa dd, genel alanı kapmak ve sonra ait olmayan şeyleri kaldırmak için besleyebileceğiniz bir ofsetiniz olacaktır .

O dizinden beri hiçbir şey yapmadım

Dizininiz bir bağlama noktası olmazsa ... çoğu dosya sistemi gerçekten "dizin başına" yer ayırmaz, bu nedenle ... tüm dosya sistemindeki tüm yazma işlemleri aradığınız bitin üzerine yazabilir. Veri kurtarma durumunda, genellikle her şeyi salt okunur moda geçirirsiniz.


Her dosyanın birçok blokta saklandığını ve genellikle art arda depolanmadığını unutmayın. Yani stringsson derece şanslı değilseniz sadece dosyanın bazı bölümlerini bulacaktır.
Gilles 'SO- kötü olmayı bırak'

3
Tam tersine, parçalanmış bir 10KB dosya bulmak için son derece şanssız olmanız gerekir. Sadece bir parça bulursanız, bu durumda diğer parçanın üzerine yazılması daha olasıdır. Ancak, bu dosya sisteminde çok fazla yazma etkinliğiniz yoksa veya anında atılan bir SSD değilse, düzenleme sırasında bu dosyayı birkaç kez kaydettiyseniz, o dosyanın birçok kopyasını bulabilirsiniz.
frostschutz

3
Daha strings -n16hızlı gitmek için tavsiye ederim veya makul bir minimum uzunluk.
Peter Cordes

İyi bir nokta, cevaba ekledi.
frostschutz

4
Çok teşekkürler. Dosyanın sonundan sadece çöp geçiyordu, ancak stringstüm dosyayı bölümün başka bir yerinde bulabildim. Bu, neredeyse iki ay boyunca yapmam gerekmiyor ve önemli bir şey için her zaman sürüm kontrolünü kullanmak için mükemmel bir hatırlatma.
Matthew Bedford
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.