一個非常舊的 .swp 文件恢復了我正在編輯的文件,因此它現在明顯更短。從那時起我沒有在該目錄中執行任何操作,因此緊接在文件末尾的位元組應該仍然包含我的資料。我可以使用什麼函數從給定的記憶體位址讀取 N 個位元組?dd
並read
在文件邊界處停止,除非我錯過了某個地方的選項。
目前檔案大小為 3.2 KB。我不記得文件被截斷之前有多大,但可能不超過 10 KB。如何從檔案開頭讀取 10 KB,忽略檔案邊界?如果資料沒有完美保存也沒關係,只要我不用從頭開始。
答案1
通常,當編輯者儲存檔案時,他們會刪除或截斷為 0,從而釋放分配的空間,然後寫入,從而分配新的空間。這導致檔案系統將資料放置在完全不同的實體位置。所以你的想法可能行不通。
filefrag
您可以使用或取得檔案的實體位置hdparm --fibmap
,然後使用dd
直接讀取該實體位置。我在這裡在不同的上下文中描述了這個過程:https://unix.stackexchange.com/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
獲得一般區域,然後刪除不屬於的內容。
從那時起我沒有在該目錄中執行任何操作
如果您的目錄碰巧不是掛載點...大多數檔案系統並沒有真正為「每個目錄」保留空間,因此...整個檔案系統中的任何和所有寫入都可能會覆蓋您正在尋找的位元.在資料復原情況下,您通常會將整個事物切換為唯讀模式。