อ่านไฟล์ท้ายสุดเพื่อกู้คืนข้อมูล


12

ไฟล์. swp ที่เก่ามากย้อนกลับไฟล์ที่ฉันแก้ไขดังนั้นตอนนี้จึงสั้นลงอย่างมาก ฉันไม่ได้ทำสิ่งใดในไดเรกทอรีนั้นเลยดังนั้นไบต์ที่ตามหลังจุดสิ้นสุดของไฟล์ควรมีข้อมูลของฉันอยู่ ฉันสามารถใช้ฟังก์ชันใดเพื่ออ่าน N ไบต์จากที่อยู่หน่วยความจำที่ให้ไว้ ddและreadหยุดที่ขอบเขตไฟล์เว้นแต่ฉันจะพลาดตัวเลือก

ขนาดไฟล์ปัจจุบันคือ 3.2 KB ฉันจำไม่ได้ว่าไฟล์มีขนาดใหญ่เพียงใดก่อนที่จะถูกตัดทอน แต่อาจไม่เกิน 10 KB ฉันจะอ่าน 10 KB จากจุดเริ่มต้นของไฟล์โดยไม่สนใจขอบเขตไฟล์ได้อย่างไร มันก็ดีถ้าข้อมูลไม่ได้ถูกเก็บรักษาไว้อย่างสมบูรณ์ตราบใดที่ฉันไม่ต้องเริ่มต้นจากศูนย์

คำตอบ:


18

โดยปกติเมื่อผู้แก้ไขบันทึกไฟล์พวกเขาจะลบหรือตัดทอนเป็น 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จะค้นหาบางส่วนของไฟล์เว้นแต่ว่าคุณโชคดีมาก
Gilles 'หยุดความชั่วร้าย'

3
ค่อนข้างตรงกันข้ามคุณจะต้องโชคร้ายมากที่ต้องค้นหาไฟล์ 10KB ที่กระจัดกระจาย หากคุณพบชิ้นส่วนเท่านั้นส่วนอื่น ๆ ก็จะถูกเขียนทับในกรณีนี้ แต่ถ้าคุณมีกิจกรรมการเขียนจำนวนมากในระบบไฟล์นั้นหรือเป็น SSD ที่มีการยกเลิกทันทีหากคุณบันทึกไฟล์นั้นหลายครั้งในขณะที่แก้ไขคุณอาจพบสำเนาของไฟล์นั้นมากมาย
frostschutz

3
ฉันแนะนำstrings -n16หรือความยาวต่ำสุดที่สมเหตุสมผลเพื่อให้ทำงานได้เร็วขึ้น
Peter Cordes

จุดดีเพิ่มลงในคำตอบ
frostschutz

4
ขอบคุณมัด มีเพียงขยะเพิ่งผ่านจุดสิ้นสุดของไฟล์ แต่ด้วยstringsฉันสามารถค้นหาไฟล์ทั้งหมดที่อื่นในพาร์ติชัน นั่นเป็นงานเกือบสองเดือนที่ฉันไม่ต้องทำและการเตือนที่ยอดเยี่ยมให้ใช้การควบคุมเวอร์ชันสำหรับสิ่งที่สำคัญเสมอ
Matthew Bedford
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.