对于rm,很多人都有惨痛的教训。我也遇到一次,一下午写的程序就被rm掉了,幸好只是一个文件,第二天很快又重新写了一遍。但是很多人可能就不像我这么幸运了。本文收集了一些在Linux下恢复rm删除的文件的方法,给大家作为参考。

  首先,最好的方法是避免这个问题,以下是几点建议:

  1、rm -rf误操作的后果是可怕的,rm -f也要三思而行,不能轻易使用。

  2、做好数据备份。

  3、用一些策略避免出错:

  提倡在shell下用 TAB 补全,用脚本执行任务,减少出错的机会。或者编写一个脚本,起名rm,在脚本里将真实的rm改为mv ,将删除的都mv到一个指定的目录里面,定期清理。

  那么rm删除的文件还能恢复吗?

  rm的man里面有如下说法:

  请注意,如果使用 rm 来删除文件,通常仍可以将该文件恢复原状。如果想保证该文件的内容无法还原,请考虑使用 shred。

  所以理论上rm删除的文件是还能恢复的。删掉文件其实只是将指向数据块的索引点(information nodes)释放,只要不被覆盖,数据其实还在硬盘上,关键在于找出索引点,然后将其所指数据块内的数据抓出,再保存到另外的分区。在用rm误删除文件后,我们要做的第一件事就是保证不再向误删文件的分区写数据。

  通常我们可以有以下几种选择:

  1、借助工具。

  2、自己写程序。你需要会编程并了解对应的文件系统。

  3、如果数据很有用,也许可以找专业公司抢救。

  工具

  1、The Sleuth Kit http://www.sleuthkit.org/sleuthkit/(Autopsy是它的一个图形前端)

  2、Foremost    http://foremost.sourceforge.net

  3、一个全能的工具,Finaldata,可以恢复unix/linux/dos下误删的文件。对于unix,支持这些产品,     Solaris、AIX和HP-UX。对于linux,支持EXT2的文件系统。对于dos,支持FAT 12/16/32, NTFS 4/5/5.1 的文件系统。

  4、如果文件系统是ext2(对ext3无效):

  ext3的删除机制是直接把 inode data 删除了,所以造成 ext3 无法反删除(ext3设计为无法恢复被删除的文件)。

  unrm

  ext2ed

  debugfs(undel lsdel )

  recover

  Midnight Commander(mc)

  e2undel

  tct

  5、如果文件系统是FAT32或者NTFS:

  EasyRecovery

  Finaldata

  6、freebsd如果使用了rm,可以试一下undelete这个命令.

  7、当进程打开了某个文件时,只要该进程保持打开该文件,lsof可以用来恢复删除文件。

恢复被误删文件的方法

  大多数Linux发行版都提供一个debugfs工具,可以用来对Ext2文件系统进行编辑操作。不过在使用这个工具之前,还有一些工作要做。

  首先以只读方式重新挂载被误删的文件所在分区。使用如下命令:(假设文件在/usr分区)

  mount –r –n –o remount /usr -r表示只读方式挂载;-n表示不写入/etc/mtab,如果是恢复/etc上的文件,就加上这个参数。如果系统说xxx partion busy,可以用fuser命令查看一下是哪些进程使用这个分区上的文件:

  fuser –v –m /usr

  如果没有什么重要的进程,用以下命令停掉它们:

  fuser -k –v –m /usr

  然后就可以重新挂载这些文件系统了。

  如果是把所有的文件统一安装在一个大的/分区当中,可以在boot提示符下用linux single进入单用户模式,尽量减少系统进程向硬盘写入数据的机会,要不干脆把硬盘挂在别的机器上。另外,恢复出来的数据不要写到/上面,避免破坏那些有用的数据。如果机器上有dos/windows,可以写到这些分区上面:

mount –r –n /dev/hda1 /mnt/had

然后就可以执行debugfs:(假设Linux在 /dev/hda5)

#debugfs /dev/hda5

就会出现debugfs提示符debugfs:

使用lsdel命令可以列出很多被删除的文件的信息:

debugfs:lsdel

debugfs: 2692 deleted inodes found.

Inode Owner Mode Size Blocks Time deleted

164821 0 100600 8192 1/ 1 Sun May 13 19:22:46 2001

…………………………………………………………

36137 0 100644 4 1/ 1 Tue Apr 24 10:11:15 2001

196829 0 100644 149500 38/ 38 Mon May 27 13:52:04 2001

debugfs:

  列出的文件有很多(这里找到2692个),第一字段是文件节点号,第二字段是文件所有者,第三字段是读写权限,接下来是文件大小,占用块数,删除时间。

然后就可以根据文件大小和删除日期判断那些是我们需要的。比如我们要恢复节点是196829的文件:

  可以先看看文件数据状态:

debugfs:stat <196829>

Inode: 196829 Type: regular Mode: 0644 Flags: 0x0 Version: 1

User: 0 Group: 0 Size: 149500

File ACL: 0 Directory ACL: 0

Links: 0 Blockcount: 38

Fragment: Address: 0 Number: 0 Size: 0

ctime: 0x31a9a574 -- Mon May 27 13:52:04 2001

atime: 0x31a21dd1 -- Tue May 21 20:47:29 2001

mtime: 0x313bf4d7 -- Tue Mar 5 08:01:27 2001

dtime: 0x31a9a574 -- Mon May 27 13:52:04 2001

BLOCKS:

594810 594811 594814 594815 594816 594817 ………………………………….

TOTAL: 38

然后就可以用dump指令恢复文件:

debugfs:dump <196829> /mnt/hda/01.sav

这样就把文件恢复出来了。退出debugfs:

debugfs:quit

另一种方法是手工编辑inode:

debugfs:mi <196829>

Mode [0100644]

User ID [0]

Group ID [0]

Size [149500]

Creation time [0x31a9a574]

Modification time [0x31a9a574]

Access time [0x31a21dd1]

Deletion time [0x31a9a574] 0

Link count [0] 1

Block count [38]

File flags [0x0]

Reserved1 [0]

File acl [0]

…………………………….

Triple Indirect Block [0]

  使用mi指令后每次显示一行信息以供编辑,其它行可以直接按回车表示确认,把deletion time改成0(未删除),Link count改成1。改好后退出debugfs:

  debugfs:quit

  然后用fsck检查/dev/hda5

  fsck /dev/hda5

  程序会说找到丢失的数据块,放在lost+found里面。这个目录里的文件就是我们要的东东。

Linux下用rm删除的文件的恢复方法相关推荐

  1. linux中rm删除的文件是否可以恢复,Linux下用rm删除的文件的恢复方法

    Linux下用rm删除的文件的恢复方法_Linux教程_Linux公社-Linux系统门户网站 https://www.linuxidc.com/Linux/2008-08/14744.htm lin ...

  2. linux命令行进入回收站,Linux 终端命令 rm 删除的文件进入回收站实现方法

    第一步 新建个脚本内容如下: #!/bin/sh # script to send removed files to trash directory mv $@ ~/.local/share/Tras ...

  3. linux中用rm删除的文件如何恢复

    Linux中用rm删除的文件可以使用文件恢复工具如testdisk.photorec等来尝试恢复.这些工具可以扫描磁盘并尝试找回已删除的文件.但是,并不能保证能够完全恢复文件,因为删除文件后,磁盘上的 ...

  4. linux 误删除mysql表能恢复吗_linux rm误删除数据库文件的恢复方法

    1.首先测试rm 误删除数据库文件 [oracle@primary dbwdn]$ ll total 2153164 -rw-r----- 1 oracle dba 8536064 Nov 27 21 ...

  5. 用linux命令清空文件夹,技能包!Linux 下清空或删除大文件内容的 5 种方法

    导读 在 Linux 终端下处理文件时,有时我们想直接清空文件的内容但又不必使用任何Linux命令行编辑器 去打开这些文件.那怎样才能达到这个目的呢?在这篇文章中,我们将介绍几种借助一些实用的命令来清 ...

  6. Linux 下Shell脚本删除过期文件

    在写这个shell之前先说一下,stat命令的使用方法 一.关于时间戳 每一个文件都有3中时间(称为时间戳timestamps),对这3种时间,很多时候容易混淆不清,因此 这里要说明下:   Acce ...

  7. Linux 下清空或删除大文件内容的 5 种方法

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 下面的这些方法都是从命令行中达到清空文件的目的. 使用名为 access.log 的文件作为示例样本 ...

  8. Linux下.gz和.tar.gz文件解压方法

    一.gz文件的解压方法: 1. gzip命令 gzip -d test.gz 2. zcat命令 使用zcat  命令,然后将标准输出保存文件 zcat test.gz > test 二. ta ...

  9. 电脑进水后自救技巧以及被删除的文件如何恢复方法分享

    你知道玩笔记本电脑最担心的是什么吗? 是电脑突然断电?还是电脑中了病毒?这些都不是!碰到电脑进水的情况才是最令人头疼的. 那么,遇到这种情况我们要怎么解决呢? 第一:切断电脑电源 电脑刚进水时,还没有 ...

  10. linux不同机器之间的拷贝,Linux下不同机器之间的文件拷贝

    通过 scp 命令实现不同机器之间的文件拷贝. (1)本机考到目标机器:scp 本机文件 目的地: (2)其他机器考到本机:scp 其他机器上的文件 本机路径 20160701补充:通过scp与win ...

最新文章

  1. 如何给HTML添加事件?
  2. 安卓盒子运行 linux,全志 Allwinner A20 机顶盒刷入原生 Debian
  3. Redis 6.0 新特性,多线程连环 13 问!
  4. 一文详解支持向量机(SVM)
  5. 数据库中删除语句Drop、Delete、Truncate的相同点和不同点的比较(举例说明)
  6. Selenium Web 自动化 - 项目实战(三)
  7. 弹性碰撞后速度方向_IPC: SIGGRAPH 2020开源有限元碰撞独家处理方案
  8. 动态规划——删除并获得点数(Leetcode 740)
  9. 成为iPhone游戏开发者的十大秘技
  10. jquery水平垂直居中_Java Web应用程序集成的jQuery UI选项卡(水平和垂直)示例
  11. JVM监控及诊断工具GUI篇之Eclipse MAT
  12. Qgis 3.18 的安装步骤
  13. Qt QTableView详解
  14. C/C++ 程序员的编程修养
  15. 超强干货:企业数据防泄密的26种实用方法
  16. 蓝桥杯嵌入式LCD显示与LED显示问题
  17. 你公司到底需不需要引入实时计算引擎?
  18. html静态网站基于游戏网站设计与实现共计10个页面 (仿地下城与勇士游戏网页)...
  19. 引入隔离率与潜伏人员的SIR模型附matlab代码
  20. Windows下Robomongo安装与配置

热门文章

  1. Tomcat 修改网站旁边的小图标
  2. C语言获取程序运行时间
  3. php 生成拼音缩写,php 输入汉字自动带出拼音和英文
  4. python 预编译加速_Python加速
  5. Can‘t Update No tracked branch configured for branch
  6. kali linux 安装谷歌浏览器
  7. 别人恃才自傲,你却虚怀若谷。——保持谦虚
  8. 异常声音检测之kaldi DNN 训练
  9. 不同时区时间换算_世界时间换算(全球时间对照表)
  10. 使用spss求标准化的线性回归方程