在ext2上恢复被删除的文件

上周一,出了点小意外。删文件的时候本来要敲:
rm data*
结果手一抖,敲成了:
rm data *
然后,我上上周写的代码就全没了。。。还好在同事的帮助下,找回了所有的源代码,方法转帖如下,希望以后不会再有机会用上。
==================================
在平时工作中一般会由于误操作而删除重要文件,其中最主要的是不适当的使用rm -rf命令。文件被删除之后不再显示文件名信息,只能从文件的大小和删除时间等上来判断是否为所需文件,一般需要查看文件内容才能确定,因此找一个文件可能需要恢复成千上万个文件之后才能完成。工作量非常大,最好能够用脚本来实现自动恢复。但是在debugfs的环境下一般脚本无法执行,下面提供几个组合命令及其使用示例,用户可以根据这些命令来编写脚本实现大量文件的恢复工作。当然最后文件的找回还是需要逐个去看才能确定。

1. 把所有删除文件的信息导入文件中

echo lsdel | debugfs -w /dev/sdb1 > dellist

这样所有删除文件的信息列表就被放入文件dellist中了,可以打开文件查看具体信息,也可以使用脚本过滤需要字段。

2. 批量恢复被删除文件

echo "dump /home/find/1.txt " | debugfs -w /dev/sdb1

该命令可以把inode号为inode_num的被删除文件内容导入到/home/find/1.txt 文件中,也可以对多个文件进行操作,例如:

echo -e "dump <29261924> /root/find/2.txt \n dump <29261923> /root/find/3.txt" | debugfs -w /dev/sdb1

同样我们可以用脚本来实现,例如:
文件aa中存放的是从dellist中得到的需要恢复的文件inode号列表,格式如下:

[root@test02 ~]# more aa
29261925
29261924
29261923
29261922
29261921

可以使用命令:

cat aa | awk '{print "dump <"$1"> /home/find/"$1;}' | debugfs -w /dev/sdb1

这样aa中列出的文件就都被放入/home/find下,并且以它自己的inode号命名。


Last modified on 2009-08-23