小记Linux/UNIX下错删文件恢复

原文请猛戳:
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找到打开文件的进程,有了PIDFD以后,就能够执行如下命令恢复文件: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工具,相较extundeletedebugfs适用于ext2/ext3/ext4文件系统shell

debugfs -w /dev/<device>

debugfs中用lsdel查找最近的删除操做,找到被删文件的inode:vim

debugfs: lsdel

接下来固然仍是能够用extundelete工具

extundelete --restore-inode <inode>

不过也能够用debugfspost

debugfs: dump <inode> <recovered-file>

很多资料还提到,能够先在debugfs中用:

debugfs: logdump -i <inode>

找到如下信息

Blocks: (<block id>): <block offset>

再经过dd命令恢复文件。

不过个人问题竟也没法经过extundeletedebugfs搞定,无奈只好用PhotoRec“黑科技”了...PhotoRec恢复后的文件名好乱,好在我还有ag这种大杀器,找到被删的配置文件是分分钟的事XDD

参考资料

  1. man proc

  2. Finding open files with lsof

  3. Bring back deleted files with lsof

  4. How to recover deleted file if it is still opened by some process?

  5. 身为Arch党天然要安利一发Archwiki:File recovery

  6. Recovering files from ext4 partition

  7. man debugfs

  8. Linux debugfs Hack: Undelete Files

  9. Linux file deleted recovery

  10. undelete a just deleted file on ext4 with extundelete

  11. Unix/Linux undelete/recover deleted files

  12. debugfs总结

  13. 恢复Ext3下被删除的文件

  14. 这里有一些脚本用来整理PhotoRec恢复的文件

相关文章
相关标签/搜索