原文請猛戳:
http://galoisplusplus.gitcafe.io/blog/2016/02/02/how-to-restore-deleted-file-in-linux/php
一個月前,個人潔癖犯了,想執行find . -name "*~" -exec rm {} \;
清下某目錄下由vim生成的~文件,不料漏打了~
,把一些文件刪掉了...好在有用git
作版本控制,即便.git/index
也被刪沒了,但也能夠經過git reset
恢復,以後再用git
恢復版本管理中的其餘被刪文件便可。不料今天二月二號,我又犯二了,被作死歷史find . -name "*" -exec rm {} \;
坑了一把...此次被刪的還有很多特地不放在版本控制的配置文件,此次不得不作文件恢復了。html
最簡單的狀況是被刪除的文件被某個進程打開,這個時候能夠經過該進程在/proc
下的文件描述符來恢復。首先由lsof
找到打開文件的進程,有了PID
和FD
以後,就能夠執行如下命令恢復文件:node
cp /proc/<PID>/fd/<FD> <recovered-file>
不幸的是,我刪的文件並無被打開...因此不能用這種方式了。df -T
查到被刪文件所在的文件系統是ext4,因而能夠試試ext的文件恢復方法。linux
ext3/ext4文件系統的恢復能夠用extundelete
,例如恢復被誤刪的目錄能夠用:git
extundelete /dev/<device> --restore-directory <path>
恢復被誤刪的文件能夠用:github
extundelete --restore-file <path/to/deleted/file>
此外也能夠用debugfs
工具,相較extundelete
,debugfs
適用於ext2/ext3/ext4文件系統shell
debugfs -w /dev/<device>
在debugfs
中用lsdel
查找最近的刪除操做,找到被刪文件的inode:vim
debugfs: lsdel
接下來固然仍是能夠用extundelete
:工具
extundelete --restore-inode <inode>
不過也能夠用debugfs
:post
debugfs: dump <inode> <recovered-file>
很多資料還提到,能夠先在debugfs
中用:
debugfs: logdump -i <inode>
找到如下信息
Blocks: (<block id>): <block offset>
再經過dd
命令恢復文件。
不過個人問題竟也沒法經過extundelete
或debugfs
搞定,無奈只好用PhotoRec「黑科技」了...PhotoRec恢復後的文件名好亂,好在我還有ag這種大殺器,找到被刪的配置文件是分分鐘的事XDD
How to recover deleted file if it is still opened by some process?
身爲Arch黨天然要安利一發Archwiki:File recovery
這裏有一些腳本用來整理PhotoRec恢復的文件