Jawabannya adalah "Mungkin ya, tetapi itu tergantung pada tipe sistem file, dan waktunya."
Tidak satu pun dari ketiga contoh akan menimpa blok data fisik old_file atau existing_file, kecuali secara kebetulan.
mv new_file old_file
. Ini akan membatalkan tautan old_file. Jika ada tautan keras tambahan ke old_file, blok akan tetap tidak berubah di tautan yang tersisa. Jika tidak, blok umumnya (tergantung pada jenis sistem file) ditempatkan pada daftar gratis. Kemudian, jika mv
membutuhkan penyalinan (yang bertentangan dengan hanya memindahkan entri direktori), blok baru akan dialokasikan sebagai tulisan mv
.
Blok-blok yang baru dialokasikan ini mungkin atau mungkin tidak sama dengan yang baru saja dibebaskan . Pada sistem file seperti UFS , blok dialokasikan, jika mungkin, dari grup silinder yang sama dengan direktori tempat file tersebut dibuat. Jadi ada peluang untuk memutuskan tautan file dari direktori dan membuat file di direktori yang sama akan digunakan kembali ( dan menimpa) beberapa blok yang sama yang baru saja dibebaskan. Inilah sebabnya mengapa saran standar untuk orang-orang yang secara tidak sengaja menghapus file adalah untuk tidak menulis data baru ke file di pohon direktori mereka (dan lebih disukai tidak ke seluruh sistem file) sampai seseorang dapat mencoba pemulihan file.
cp new_file old_file
akan melakukan hal berikut (Anda dapat menggunakan strace
untuk melihat panggilan sistem):
open ("old_file", O_WRONLY | O_TRUNC) = 4
Bendera O_TRUNC akan menyebabkan semua blok data dibebaskan, seperti yang mv
dilakukan di atas. Dan seperti di atas, mereka umumnya akan ditambahkan ke daftar gratis, dan mungkin atau tidak dapat digunakan kembali oleh penulisan selanjutnya yang dilakukan oleh cp
perintah.
vi existing_file
. Jika vi
benar vim
, :x
perintah melakukan hal berikut:
batalkan tautan ("existing_file ~") = -1 ENOENT (Tidak ada file atau direktori seperti itu)
rename ("existing_file", "existing_file ~") = 0
open ("existing_file", O_WRONLY | O_CREAT | O_TRUNC, 0664) = 3
Jadi bahkan tidak menghapus data lama; data disimpan dalam file cadangan.
Pada FreeBSD, vi
apakah open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
, yang akan memiliki semantik yang sama dengan cp
, di atas.
Anda dapat memulihkan sebagian atau semua data tanpa program khusus; yang Anda butuhkan adalah grep
dan dd
, dan akses ke perangkat mentah.
Untuk file teks kecil, grep
perintah tunggal dalam jawaban dari @Steven D dalam pertanyaan yang Anda tautkan adalah cara termudah:
grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
Tetapi untuk file yang lebih besar yang mungkin berada di beberapa blok yang tidak bersebelahan, saya melakukan ini:
grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file
yang akan memberi Anda offset dalam byte dari garis yang cocok. Ikuti ini dengan serangkaian dd
perintah, dimulai dengan
dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
Anda juga ingin membaca beberapa blok sebelum dan sesudah blok itu. Pada UFS, blok file biasanya 8KB dan biasanya dialokasikan cukup berdekatan, satu blok file disisipkan secara bergantian dengan blok 8KB dari file lain atau ruang kosong. Ekor file di UFS hingga 7 1KB fragmen, yang mungkin atau mungkin tidak berdekatan.
Tentu saja, pada sistem file yang memampatkan atau mengenkripsi data, pemulihan mungkin tidak semudah ini.
Sebenarnya ada sangat sedikit utilitas di Unix yang akan menimpa blok data file yang ada. Salah satu yang terlintas dalam pikiran adalah dd conv=notrunc
. Yang lain adalah shred
.