คำตอบคือ "อาจใช่ แต่ขึ้นอยู่กับประเภทของระบบไฟล์และเวลา"
ไม่มีตัวอย่างทั้งสามที่จะเขียนทับบล็อกข้อมูลทางกายภาพของ old_file หรือ existing_file ยกเว้นโดยบังเอิญ
mv new_file old_file
. นี่จะเป็นการยกเลิกการเชื่อมโยงไฟล์เก่า หากมีฮาร์ดลิงก์เพิ่มเติมไปยัง old_file บล็อกจะยังคงไม่เปลี่ยนแปลงในลิงก์ที่เหลือเหล่านั้น มิฉะนั้นบล็อกจะโดยทั่วไป (ขึ้นอยู่กับประเภทของระบบไฟล์) จะถูกวางในรายการฟรี จากนั้นหากmv
ต้องการคัดลอก (ตรงข้ามกับการย้ายรายการไดเรกทอรี) บล็อกใหม่จะถูกจัดสรรเป็นการmv
เขียน
บล็อกเหล่านี้เพิ่งได้รับการจัดสรรอาจหรือไม่อาจจะเป็นคนเดียวกับที่เป็นอิสระเพียง บนระบบไฟล์เช่นUFSบล็อกจะถูกจัดสรรหากเป็นไปได้จากกลุ่มรูปทรงกระบอกเดียวกับไดเรกทอรีที่ไฟล์ถูกสร้างขึ้นดังนั้นจึงมีโอกาสที่การยกเลิกการเชื่อมโยงไฟล์จากไดเรกทอรีและสร้างไฟล์ในไดเรกทอรีเดียวกันนั้นจะใช้งานอีกครั้ง ( และเขียนทับ) บล็อกเดียวกันบางส่วนที่เพิ่งถูกปล่อยให้เป็นอิสระ นี่คือเหตุผลที่คำแนะนำมาตรฐานสำหรับผู้ที่ลบไฟล์โดยไม่ตั้งใจคือไม่เขียนข้อมูลใหม่ไปยังไฟล์ในแผนผังไดเรกทอรี (และไม่ควรไปที่ระบบไฟล์ทั้งหมด) จนกว่าผู้ใช้จะสามารถกู้คืนไฟล์ได้
cp new_file old_file
จะทำสิ่งต่อไปนี้ (คุณสามารถใช้strace
เพื่อดูการเรียกของระบบ):
เปิด ("old_file", O_WRONLY | O_TRUNC) = 4
การตั้งค่าสถานะ O_TRUNC จะทำให้บล็อกข้อมูลทั้งหมดเป็นอิสระเช่นเดียวกับที่mv
ได้ทำข้างต้น และตามข้างต้นพวกเขามักจะถูกเพิ่มลงในรายการฟรีและอาจหรือไม่อาจถูกนำมาใช้ซ้ำโดยการเขียนที่ตามมาทำโดยcp
คำสั่ง
vi existing_file
. ถ้าvi
เป็นจริงvim
ที่:x
คำสั่งไม่ต่อไปนี้:
unlink ("existing_file ~") = -1 ENOENT (ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว)
เปลี่ยนชื่อ ("existing_file", "existing_file ~") = 0
open ("existing_file", O_WRONLY | O_CREAT | O_TRUNC, 0664) = 3
ดังนั้นจึงไม่ได้ลบข้อมูลเก่า ข้อมูลจะถูกเก็บไว้ในไฟล์สำรอง
ใน FreeBSD vi
ทำopen("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
เช่นนั้นซึ่งจะมีความหมายเช่นเดียวกับcp
ข้างต้น
คุณสามารถกู้คืนข้อมูลบางส่วนหรือทั้งหมดได้โดยไม่ต้องใช้โปรแกรมพิเศษ ทั้งหมดที่คุณต้องการgrep
และdd
และการเข้าถึงอุปกรณ์ดิบ
สำหรับไฟล์ข้อความขนาดเล็กgrep
คำสั่งเดียวในคำตอบจาก @Steven Dในคำถามที่คุณลิงก์ไปนั้นเป็นวิธีที่ง่ายที่สุด:
grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
แต่สำหรับไฟล์ที่มีขนาดใหญ่กว่าซึ่งอาจอยู่ในบล็อกที่ไม่ต่อเนื่องหลายชุดฉันจะทำสิ่งนี้:
grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file
ซึ่งจะให้ออฟเซ็ตเป็นไบต์ของบรรทัดที่ตรงกัน ทำตามนี้ด้วยชุดdd
คำสั่งเริ่มต้นด้วย
dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
คุณต้องการอ่านบล็อกก่อนและหลังบล็อกนั้นด้วย บน UFS บล็อกไฟล์โดยทั่วไปคือ 8KB และมักจะจัดสรรอย่างต่อเนื่องค่อนข้างบล็อกของไฟล์เดียวถูก interleaved สลับกับบล็อก 8KB จากไฟล์อื่นหรือพื้นที่ว่าง ส่วนท้ายของไฟล์บน UFS มีมากถึง 7 1KB แฟรกเมนต์ซึ่งอาจหรือไม่ต่อเนื่องกันก็ได้
แน่นอนว่าระบบไฟล์ที่บีบอัดหรือเข้ารหัสข้อมูลการกู้คืนอาจไม่ตรงไปตรงมา
มียูทิลิตี้น้อยมากใน Unix ที่จะเขียนทับบล็อคข้อมูลของไฟล์ที่มีอยู่ dd conv=notrunc
หนึ่งที่อยู่ในใจคือ shred
อีกประการหนึ่งคือ