Cevap "Muhtemelen evet, ancak dosya sistemi türüne ve zamanlamasına bağlı."
Bu üç örnekten hiçbiri, old_file veya exist_file öğesinin fiziksel veri bloklarının, şans eseri haricinde üzerine yazmayacak.
mv new_file old_file
. Bu old_file'in bağlantısını kaldırır. Old_file dosyasına ek sabit linkler varsa, kalan linklerde bloklar değişmeden kalacaktır. Aksi takdirde, bloklar genellikle (dosya sistemi türüne göre değişir) ücretsiz bir listeye yerleştirilir. Daha sonra, eğer mv
kopyalama gerekiyorsa (sadece hareketli dizin girişlerinin aksine), yeni bloklar mv
yazma olarak tahsis edilecektir .
Yeni tahsis edilen bu bloklar , henüz serbest bırakılanlarla aynı olabilir veya olmayabilir . UFS gibi dosya sistemlerinde , bloklar, mümkünse, dosyanın oluşturulduğu dizinin aynı silindir grubundan ayrılır. Bu nedenle, bir dosyayı bir dizinden ayırmanın ve aynı dizinde bir dosya oluşturmanın yeniden kullanılma olasılığı vardır ( ve üzerine yaz) sadece serbest bırakılan bloklardan bazıları. Bu nedenle, bir dosyayı yanlışlıkla silen insanlara standart tavsiye, birisi dosya kurtarma girişiminde bulunana kadar, dizin ağacındaki dosyalara (ve tercihen tüm dosya sistemine) yeni veri yazmamaktır.
cp new_file old_file
şunları yapacak ( strace
sistem çağrılarını görmek için kullanabilirsiniz):
açık ("old_file", O_WRONLY | O_TRUNC) = 4
O_TRUNC bayrağı, mv
yukarıda olduğu gibi tüm veri bloklarının serbest kalmasına neden olacaktır . Ve yukarıda olduğu gibi, genellikle ücretsiz bir listeye eklenirler ve cp
komut tarafından yapılan sonraki yazılar tarafından yeniden kullanılabilirler veya yeniden kullanılamazlar .
vi existing_file
. Eğer vi
öyleyse vim
, :x
komut aşağıdakileri yapar:
unlink ("existing_file ~") = -1 ENOENT (Böyle bir dosya veya dizin yok)
yeniden adlandır ("existing_file", "existing_file ~") = 0
açık ("existing_file", O_WRONLY | O_CREAT | O_TRUNC, 0664) = 3
Yani eski verileri bile kaldırmaz; veriler bir yedekleme dosyasında korunur.
FreeBSD üzerindeyken vi
yaptığı open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
aynı anlamlara sahip olan, cp
yukarıda.
Özel programlar olmadan verilerin bir kısmını veya tamamını kurtarabilirsiniz; tüm ihtiyaç vardır grep
ve dd
ve ham cihaza erişim.
Küçük metin dosyaları için, bağladığınız sorudaki @Steven D'grep
nin cevabındaki tek komut en kolay yoldur:
grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
Ancak birden çok bitişik olmayan bloklarda olabilecek daha büyük dosyalar için şunu yapıyorum:
grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file
bu size eşleşen çizginin bayt cinsinden ofsetini verecektir. Bunu bir dizi dd
komutla izleyin.
dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
Ayrıca bu bloktan önce ve sonra birkaç blok okumak istersiniz. UFS'de, dosya blokları genellikle 8KB'dir ve genellikle oldukça bitişik olarak tahsis edilir, tek bir dosyanın blokları diğer dosyalardan veya boş alandan gelen 8 KB bloklarla dönüşümlü olarak birleştirilir. UFS'deki bir dosyanın kuyruğu, bitişik olabilen veya olamayabilen 7 KB değerine kadardır.
Elbette, verileri sıkıştıran veya şifreleyen dosya sistemlerinde, kurtarma işlemi bu kadar basit olmayabilir.
Unix'te mevcut bir dosyanın veri bloklarının üzerine yazacak çok az yardımcı program var. Akla gelen bir şey var dd conv=notrunc
. Başka bir shred
.