Linux 下误删除恢复,(文件名无法找回)
手贱命令写错了,直接把一个目录下的文件全删了,用下面的方法虽然恢复了,但是还是有几个文件没有找回来。。。(可以找回,但是要在另一个盘进行操作)
如果不小心用rm –rf xxx删除了文件或目录,在ext2文件系统上是可以恢复的,但需要满足以下3个基本条件:
- 1. 需要有root的权限;
- 2. 删除文件所在的文件系统类型是ext2,可以用”df –T”命令查看文件系统类型;
- 3. 安装有debugfs,Linux默认都自带的,可以”whereis debugfs”看下debugfs是否存在。
满足了以上3个条件就可以开始动手恢复了。被删除的文件数据一般不会实际删除掉,只是索引被删除而已,除非被后面的写磁盘操作覆盖,另外,删除的文件是没办法获取到文件名的,只有一个inode的编号,如果你想通过文件名恢复文件那只是徒劳,不过还是有很多办法准确恢复出我们想要的数据,下面以实际操作过程进行演示:
假设我不小心用”rm *”删除了/home/xuanbiao/delfiles目录下的3个.h文件。
恢复过程如下:
- 1. 查看当前的系统时间,大概确定文件什么时候被删除的,这个后面会有用:
$ date
Wed Oct 8 19:56:53 CST 2008
- 2. 获取用户的uid,这个后面定位删除文件的时候也会有用,如果不知道是哪个用户删除的也没关系,还可以根据其它的信息来定位:
$ cat /etc/passwd | grep "xuanbiao"
xuanbiao:x:663:504::/home/xuanbiao:/bin/bash
第3列即用户”xuanbiao”对应的uid
- 3. 查看一下磁盘的使用情况:
$ df –T
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/sda1 ext2 10317828 3591220 6202492 37% /
none tmpfs 2022720 0 2022720 0% /dev/shm
/dev/sda3 ext2 340815496 54413776 269089276 17% /home
以上可以确定删除文件所在的文件系统类型是ext2,磁盘的使用率是17%,由于这台机子有很多用户在使用,而且磁盘还有很大的空间,不用担心删除的文件被覆盖。但你想确保成功率或者机子只有较少用户使用情况下,可以将删除文件所在分区挂载为只读模式:
$ umount /mnt/entertain
$ mount /dev/sda3 /mnt/entertain -o ro
- 4. 切换到root用户:
$ su root
- 5. 找到debugfs所在位置:
$ whereis debugfs
debugfs: /sbin/debugfs /usr/share/man/man8/debugfs.8.gz
- 6. 运行debugfs打开删除文件所在的分区:
$ /sbin/debugfs /dev/sda3
debugfs 1.35 (28-Feb-2004)
debugfs:
- 7. 列出所有被删除的文件:
在上面显示的debugfs命令行下输入lsdel
debugfs:lsdel
这个步骤需要一定的时间,分区越大时间越长,debugfs会扫描整个分区的所有indoe,然后将被删除的inode以more的形式打印出来:
Inode Owner Mode Size Blocks Time deleted
18448394 500 100664 4033517 986/ 986 Tue Jul 1 12:19:41 2008
13 0 100600 4096 1/ 1 Wed Jul 2 14:26:47 2008
4866049 501 40700 0 1/ 1 Thu Jul 3 11:12:46 2008
4866050 501 100644 383 1/ 1 Thu Jul 3 11:12:46 2008
4866051 501 100644 304 1/ 1 Thu Jul 3 11:12:46 2008
第1列是inode的编号,这个比较重要,第2列是uid,第4列是文件大小,第6列是删除的时间。
- 8. 定位被删除的文件:
Debugfs以more形式列出所有被删除的文件,如果要一个一个查找的话那是比较困难的,首先从删除时间定为,先根据步骤1获取的时间定位到当天删除的文件,如果你能精确到小时或分钟当然最好了:
/ Wed Oct 8
19628043 0 100644 52049 14/ 14 Wed Oct 8 00:00:11 2008
40618326 584 100644 4096 1/ 1 Wed Oct 8 13:38:06 2008
40618327 584 100644 123 1/ 1 Wed Oct 8 13:38:06 2008
39634369 588 100644 12288 3/ 3 Wed Oct 8 15:08:51 2008
39634368 588 100640 16384 4/ 4 Wed Oct 8 15:08:57 2008
39634362 588 100600 48496640 713/ 713 Wed Oct 8 15:09:04 2008
39634364 588 100600 48492544 713/ 713 Wed Oct 8 15:09:04 2008
然后根据uid、删除的大概时间、删除文件个数及文件的大小来定位是哪些文件,先通过步骤2获取的uid观察第2列找到当天该用户删除的项,然后观察某个大概时间里是否刚好有这么多个文件被删除(这是因为用rm *删除的文件时间是一样的),如果文件大小也差不多那就可以很肯定了,这种定位一般是比较准确的,当然你可以把当天的所有删除文件都恢复也是可以的,然后一个一个去确认。
通过这种方法我定位到了我删除的文件:
41828370 663 100644 5817 2/ 2 Wed Oct 8 19:56:52 2008
41828371 663 100644 2371 1/ 1 Wed Oct 8 19:56:52 2008
41828372 663 100644 3077 1/ 1 Wed Oct 8 19:56:52 2008
- 9. 恢复被删除的数据:
如果文件不多可以通过命令”dump <inode> dst_file_path”一个一个恢复,另外恢复的文件最好存放在其它的分区以避免删除的数据被覆盖:
debugfs: dump <41828370> /dump/1.h
恢复了inode编号为41828370的文件,存放为/dump/1.h,打开发现确实是我删除的文件,然后就可以放心的把下面2个文件也一起恢复了。
但如果被删除的文件比较多,一个一个恢复的话那是比较麻烦的。可以选择批量恢复,步骤如下:
1) 将刚定位的inode项原始数据保存在一个文件里,如dellist
41828370 663 100644 5817 2/ 2 Wed Oct 8 19:56:52 2008
41828371 663 100644 2371 1/ 1 Wed Oct 8 19:56:52 2008
41828372 663 100644 3077 1/ 1 Wed Oct 8 19:56:52 2008
2) 然后将dellist文件数据转换一下:
$ cat dellist | awk '{print "dump <"$1"> /dump/"$1".h"}' > cmd
cmd的内容如下:
dump <41828370> /dump/41828370.h
dump <41828371> /dump/41828371.h
dump <41828372> /dump/41828372.h
3) 批量恢复文件:
$ /sbin/debugfs /dev/sda3 < cmd
运行后就会在/dump/目录下生成了所有被删除的文件,
10. 将文件转移到xuanbiao用户目录下:
将恢复的文件拷到/home/xuanbiao的某个目录下,然后更改文件的所属者就OK了
$ chown xuanbiao:nsqa *
Linux 下误删除恢复,(文件名无法找回)的更多相关文章
- 40、Linux文件误删除恢复操作
rm -rf / #此方法删除不了/目录: rm -rf /* #此方法可以删除/目录下的所有内容,禁止使用: 40.1.前言: 作为一个多用户.多任务的操作系统,Linux下的文件一旦被删除,是难以 ...
- Linux文件误删除恢复操作
作为一个多用户.多任务的操作系统,Linux下的文件一旦被删除,是难以恢复的.尽管删除命令只是在文件节点中作删除标记,并不真正清除文件内容,但是 其他用户和一些有写盘动作的进程会很快覆盖这些数据.不过 ...
- Linux下批量修改文件名(rename)
原文地址: http://blog.csdn.net/sea_shore/article/details/6102437 1.rename命令批量修改文件名, 其实linux下可以使用别的办法来批量修 ...
- linux下修改root密码以及找回密码的方法
以root身份登陆,执行: # passwd 用户名 (修改密码) # useradd 用户名 (添加用户) 具体示例如下:[root@bogon ~]# passwd root Changing p ...
- 转://Linux下误删除/home目录的恢复方法
一般情况下,我们在安装Oracle数据库的时候,都会创建一个Oracle用户,用该用户来安装和管理Oracle.Oracle用户的根目录就是/home/oracle. 通常安装Oracle数据库是按照 ...
- Linux下误删除后的恢复操作(ext3/ext4)
Linux是作为一个多用户.多任务的操作系统,文件一旦被删除是难以恢复的.尽管删除命令只是在文件节点中作删除标记,并不真正清除文件内容,但是其他用户和一些有写盘动作的进程会很快覆盖这些数据.在日常工程 ...
- Linux下vim查看文件名
在vim下编辑时,有时候看不到文件名,不知道编辑的是那个文件,怎么呢,可以按照下面的方法试试. 查看文件名 在正常模式下: :f 或CTRL+G 查看文件的路径 用 :!pwd 可以看当前的详细路径. ...
- Linux下批量修改文件名方法
对于在Linux中修改文件名的方式一般我们会用mv命令进行修改,但是mv命令是无法处理大量文件修改名称. 但是在处理大量文件的时候该如何进行批量修改呢? 方法一:mv配合for循环方式进行修改 [ro ...
- linux下批量修改文件名之rename
最近因为突然用到需匹配更换文件名,发现rename命令真是 简单好用,和sed语法及vim 替换很相似. 1. 更改文件名后缀 rename 's/\.txt/\.html/' * 2.增加文件名后缀 ...
随机推荐
- PLSQL Developer删除奇葩表出现异常ORA-00942: 表或试图不存在
简单描述一下问题:发现数据库里有两个名称相同的表,不同的是PLSQL Developer里一个表名显示是大写,而另一个表名显示是小写 一般情况下,无论建表语句是大写,还是小写,因Oracle是区分大小 ...
- 各大引擎矩阵的矩阵存储方式 ----行矩阵 or 列矩阵
OpenGL 里面的矩阵 float m[16]; OpenGL中的矩阵是这样的 m[0] m[4] m[8] m[12] m[1] m[5] m[9] m[13] m[2] m[6] m[10] ...
- layui框架遇到时间控件在搜索之后再次点击出现异常的问题
原因:使用jquery赋值html代码问题 解决方法:使用js代码处理即可,如: document.getElementsByTagName('tbody')[0].innerHTML = 自己的ht ...
- Hadoop学习笔记——安装Hadoop
sudo mv /home/common/下载/hadoop-2.7.2.tar.gz /usr/local sudo tar -xzvf hadoop-2.7.2.tar.gz sudo mv ha ...
- iOS :ViewDidAppear
进入一个 UIViewController 会调用它的三个方法,分别是 viewDidLoad, viewWillAppear, viewDidAppear. 如每个方法的名字一样,在不同的方法中要处 ...
- 创建 React-Native 工程时,如何指定特定的 React-Native 版本
react-native 可能会出现一种情况,就是版本最高的可能出现有些东西不太稳定,这时候要用到旧的版本怎么办?就可以用以下方法创建项目. 0. 原因 创建新的 React-Native (以下简称 ...
- 64位系统web项目导出excel问题分析及解决方法汇总
最近在web项目中做了一个导出Excel功能.在导出的时候报错:检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败. 一 ...
- php过滤字段htmlentities,htmlspecialchars,strip_tags
1.strip_tags:过滤html标签比如<a> <html> <script> 如: $str = '<a href="test.html&q ...
- [转]Python多线程与多线程中join()的用法
https://www.cnblogs.com/cnkai/p/7504980.html Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: 知 ...
- 让 Oracle 11g 32位运作在64位 Windows 上
并非不能运行. 本人安装版未曾尝试,但绿色版倒是运行成功了. 很简单:注册表的位置发生了变化而已! 默认(32位.64位),oracle会读取以下注册表的位置: [HKEY_LOCAL_MA ...