手贱命令写错了,直接把一个目录下的文件全删了,用下面的方法虽然恢复了,但是还是有几个文件没有找回来。。。(可以找回,但是要在另一个盘进行操作)

如果不小心用rm –rf xxx删除了文件或目录,在ext2文件系统上是可以恢复的,但需要满足以下3个基本条件:

  1. 1.     需要有root的权限;
  2. 2.     删除文件所在的文件系统类型是ext2,可以用”df –T”命令查看文件系统类型;
  3. 3.     安装有debugfs,Linux默认都自带的,可以”whereis debugfs”看下debugfs是否存在。

满足了以上3个条件就可以开始动手恢复了。被删除的文件数据一般不会实际删除掉,只是索引被删除而已,除非被后面的写磁盘操作覆盖,另外,删除的文件是没办法获取到文件名的,只有一个inode的编号,如果你想通过文件名恢复文件那只是徒劳,不过还是有很多办法准确恢复出我们想要的数据,下面以实际操作过程进行演示:

假设我不小心用”rm *”删除了/home/xuanbiao/delfiles目录下的3个.h文件。

恢复过程如下:

  1. 1.     查看当前的系统时间,大概确定文件什么时候被删除的,这个后面会有用:

$ date

Wed Oct  8 19:56:53 CST 2008

  1. 2.     获取用户的uid,这个后面定位删除文件的时候也会有用,如果不知道是哪个用户删除的也没关系,还可以根据其它的信息来定位:

$ cat /etc/passwd | grep "xuanbiao"

xuanbiao:x:663:504::/home/xuanbiao:/bin/bash

第3列即用户”xuanbiao”对应的uid

  1. 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

  1. 4.     切换到root用户:

$ su root

  1. 5.     找到debugfs所在位置:

$ whereis debugfs

debugfs: /sbin/debugfs /usr/share/man/man8/debugfs.8.gz

  1. 6.     运行debugfs打开删除文件所在的分区:

$ /sbin/debugfs /dev/sda3

debugfs 1.35 (28-Feb-2004)

debugfs:

  1. 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列是删除的时间。

  1. 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

  1. 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 下误删除恢复,(文件名无法找回)的更多相关文章

  1. 40、Linux文件误删除恢复操作

    rm -rf / #此方法删除不了/目录: rm -rf /* #此方法可以删除/目录下的所有内容,禁止使用: 40.1.前言: 作为一个多用户.多任务的操作系统,Linux下的文件一旦被删除,是难以 ...

  2. Linux文件误删除恢复操作

    作为一个多用户.多任务的操作系统,Linux下的文件一旦被删除,是难以恢复的.尽管删除命令只是在文件节点中作删除标记,并不真正清除文件内容,但是 其他用户和一些有写盘动作的进程会很快覆盖这些数据.不过 ...

  3. Linux下批量修改文件名(rename)

    原文地址: http://blog.csdn.net/sea_shore/article/details/6102437 1.rename命令批量修改文件名, 其实linux下可以使用别的办法来批量修 ...

  4. linux下修改root密码以及找回密码的方法

    以root身份登陆,执行: # passwd 用户名 (修改密码) # useradd 用户名 (添加用户) 具体示例如下:[root@bogon ~]# passwd root Changing p ...

  5. 转://Linux下误删除/home目录的恢复方法

    一般情况下,我们在安装Oracle数据库的时候,都会创建一个Oracle用户,用该用户来安装和管理Oracle.Oracle用户的根目录就是/home/oracle. 通常安装Oracle数据库是按照 ...

  6. Linux下误删除后的恢复操作(ext3/ext4)

    Linux是作为一个多用户.多任务的操作系统,文件一旦被删除是难以恢复的.尽管删除命令只是在文件节点中作删除标记,并不真正清除文件内容,但是其他用户和一些有写盘动作的进程会很快覆盖这些数据.在日常工程 ...

  7. Linux下vim查看文件名

    在vim下编辑时,有时候看不到文件名,不知道编辑的是那个文件,怎么呢,可以按照下面的方法试试. 查看文件名 在正常模式下: :f 或CTRL+G 查看文件的路径 用 :!pwd 可以看当前的详细路径. ...

  8. Linux下批量修改文件名方法

    对于在Linux中修改文件名的方式一般我们会用mv命令进行修改,但是mv命令是无法处理大量文件修改名称. 但是在处理大量文件的时候该如何进行批量修改呢? 方法一:mv配合for循环方式进行修改 [ro ...

  9. linux下批量修改文件名之rename

    最近因为突然用到需匹配更换文件名,发现rename命令真是 简单好用,和sed语法及vim 替换很相似. 1. 更改文件名后缀 rename 's/\.txt/\.html/' * 2.增加文件名后缀 ...

随机推荐

  1. Java与编码问题串讲之二–如何理解java采用Unicode编码

    Java开发者必须牢记:在Java中字符仅以一种形式存在,那就是Unicode(不选择任何特定的编码,直接使用他们在字符集中的编号,这是统一的唯一方法).由于java采用unicode编码,char  ...

  2. T4 好用的Vs扩展

  3. chrome浏览器表单自动填充默认样式(背景变黄)-autofill

    之所以出现这样的样式, 是因为Chrome会自动为input增加如下样式. 这个样式的优先级也比较高. 无法通过important覆盖(这就比较恶心了). 解决方案(3种): 1. 关闭自动保存账号密 ...

  4. spark 修改分区(存储结果需要)

    修改分区就行了val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8))#  查看分区数rdd1.partitions.length# 改成1个分区val rd ...

  5. Java编程思想学习笔记——复用类

    前言 复用代码是Java众多引人注目的功能之一. 达到复用代码的方法有: 组合:新的类由现有类的对象所组成.(复用现有代码的功能,而非它的形式) 继承:按照现有类的类型组建新类.(不改变现有类的形式, ...

  6. Fedora 安装oracle11g 之最简洁方式

    最新的Fedora 24已经释出. 赶紧尝试安装oracle11g一把.很简单,很方便. 此处以最最简洁方式来安装一把! 环境: windows xp + virtualbox ,安装 fedora ...

  7. BarTender复合条形码中的分隔符模式详解

    在BarTender 10.1中,支持使用BarTender分隔符模式的复合条形码符号体系包括GS1 Composite和GS1 DataBar (RSS).本文小编给大家详细讲解BarTender分 ...

  8. 怎么解决BarTender因为未检测到IIS安装失败的问题

    个别小伙伴在安装BarTender条码标签设计软件的时候,遇到“未检测到IIS,无法安装BarTender Web Print Server配套程序”导致安装失败的问题,本文小编给大家分享解决BarT ...

  9. springmvc+jquery实现省市区地址下拉框联动

    参考资料:http://www.cnblogs.com/whgw/archive/2012/05/11/2496667.html 1.jsp页面实现 <%@ page language=&quo ...

  10. 将文件导入到SQL server数据库表中的字段中

    一.在要执行的sql server数据库a中执行如下脚本,创建存储过程sp_textcopy /* 将二进制文件导入.导出到数据库相应字段列中 */ CREATE PROCEDURE sp_textc ...