原文请猛戳:
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恢复的文件