โดยปกติเมื่อผู้แก้ไขบันทึกไฟล์พวกเขาจะลบหรือตัดทอนเป็น 0 ซึ่งจะเป็นการเพิ่มพื้นที่ว่างแล้วจึงเขียนซึ่งจะจัดสรรพื้นที่ใหม่ ซึ่งส่งผลให้ระบบไฟล์วางข้อมูลในตำแหน่งทางกายภาพที่แตกต่างอย่างสิ้นเชิง ดังนั้นความคิดของคุณอาจไม่ทำงาน
คุณสามารถรับตำแหน่งทางกายภาพของไฟล์โดยใช้filefrag
หรือhdparm --fibmap
จากนั้นใช้dd
เพื่ออ่านตำแหน่งทางกายภาพนั้นโดยตรง ฉันได้อธิบายกระบวนการนี้ในบริบทอื่นที่นี่: /unix//a/85880/30851
ในกรณีของคุณมีโอกาสมากขึ้นที่คุณต้องการแนวทางทั่วไปในการค้นหาข้อมูลที่เป็นข้อความ ... สิ่งที่ต้องการ:
strings -n 12 -t d /dev/partition | grep -F 'text snippet'
strings
จะค้นหาข้อมูล ASCII ที่ต่อเนื่อง (รองรับการเข้ารหัสอื่น ๆ บางอย่างไม่แน่ใจเกี่ยวกับ UTF-8 หากเป็นรหัสหรือภาษาอังกฤษคุณไม่จำเป็นต้องใช้) และมันจะพิมพ์ออฟเซ็ตที่พบ
text snippet
ควรเป็นตัวอย่างข้อความที่ไม่ซ้ำใครที่คุณจำได้ว่าอยู่ในส่วนของไฟล์ที่คุณกำลังมองหา [ในบรรทัดเดียว] (หากคุณไม่ทราบอย่างแน่นอนคุณสามารถ grep ด้วยนิพจน์ทั่วไปแทน)
-n 12
คือความยาวต่ำสุดที่strings
จะมองหา ควรจะมีความยาวของคุณ12
text snippet
พารามิเตอร์นี้เป็นทางเลือกหากระบุไว้อาจช่วยstrings | grep
ให้ทำงานได้เร็วขึ้นเล็กน้อย
จะใช้เวลานานในการอ่านพาร์ติชันทั้งหมด แต่ถ้าประสบความสำเร็จคุณจะมีออฟเซ็ตที่คุณสามารถป้อนdd
เพื่อคว้าพื้นที่ทั่วไปแล้วลบสิ่งที่ไม่ได้เป็นของ
ฉันไม่ได้ทำสิ่งใดในสารบบนั้น
หากไดเรกทอรีของคุณไม่ได้เป็นจุดเชื่อมต่อ ... ระบบไฟล์ส่วนใหญ่ไม่ได้จองพื้นที่ "ต่อไดเรกทอรี" ดังนั้น ... การเขียนใด ๆ และทั้งหมดในระบบไฟล์ทั้งหมดอาจเขียนทับบิตที่คุณกำลังมองหา ในสถานการณ์การกู้คืนข้อมูลคุณมักจะเปลี่ยนสิ่งทั้งหมดเป็นโหมดอ่านอย่างเดียว
strings
จะค้นหาบางส่วนของไฟล์เว้นแต่ว่าคุณโชคดีมาก