Linux系统下不小心使用rm命令删除的文件能有办法恢复吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统下不小心使用rm命令删除的文件能有办法恢复吗?相关的知识,希望对你有一定的参考价值。

Linux系统下不小心使用rm命令删除的文件能有办法恢复吗?
有什么办法或者用什么命令?
辛苦一下午写的程序打算用mv重命名的,不知道怎么的用了rm,好可怜!

1、首先查看需要恢复的文件所在的文件系统
命令行模式下输入指令mount
[xuwangcheng14@root]#?mount/dev/xvda1?on?/?type?ext2?(rw,errors=remount-ro)proc?on?/proc?type?proc?(rw,noexec,nosuid,nodev)sysfs?on?/sys?type?sysfs?(rw,noexec,nosuid,nodev)由上知,/dev/xvda1挂载在/下,即根目录,且文件系统是ext2

2、将要找回的文件所在的分区重新挂载成只读(因为这样比较安全,可以防止因新的文件写入该分区而导致无法找回文件)
[xuwangcheng14@root]#?mount?-n?-o?remount,ro?/dev/xvda1如果不能重新挂载,那么一定有用户正在使用该分区中的文件,我们可以使用指令:fuser?-m?-v?/dev/xvda1来查看当前哪个用户正在使用该分区中的文件,然后使用fuser?-k?-m?-v?/dev/xvda1来杀死用户使用该分区的任何进程。

3、使用工具恢复文件
?[xuwangcheng14@root]#?debugfs?/dev/xvda1debugfs?1.42?(29-Nov-2011)debugfs:?lsdel进入debugfs模式后输入lsdel后可以看到被删除的文件信息
stat显示某个节点所对应的文件信息,恢复文件使用dump?文件路径。如果被删除的文件很多,那么通过lsdel可看出文件的时间,然后自己判断进行恢复。

当然还可以使用数据恢复软件,比如嗨格式数据恢复大师,嗨格式数据恢复大师是一款专家级数据恢复软件、支持误删文件恢复、回收站清空文件恢复、U盘、硬盘、SD卡、储存卡等各类存储设备数据恢复、同时支持恢复数据预览、深度扫描恢复等功能、操作简单、恢复成功率高、可免费下载试用扫描。?

参考技术A

概述

可以恢复,使用系统自还工具debugfs来还原删除的文件

步骤详解

1、 查看一下当前系统版本号,及文件系统格式

[root@localhost ~]# df -T 
Filesystem Type 1K-blocks Used Available Use% Mounted on 
/dev/mapper/VolGroup-lv_root 
ext4 51475068 22730068 26123560 47% / 
tmpfs tmpfs 3966808 68 3966740 1% /dev/shm 
/dev/sda2 ext4 487652 42534 419518 10% /boot 
/dev/mapper/VolGroup-lv_home 
ext4 901188872 20070036 835334364 3% /home

2、新建一个文件夹及文件my.txt,然后删除

[root@localhost local]# mkdir test 
[root@localhost local]# cd test 
[root@localhost test]# touch my.txt 
[root@localhost test]# ll 
总用量 0 
-rw-r–r–. 1 root root 0 1月 4 15:22 my.txt 
[root@localhost test]# rm -f my.txt 
[root@localhost test]# ll 
总用量 0

3、运用,系统自还工具debugfs来修复 打开,刚刚被删除文件所在的分区,用ls 加-d参数显示刚刚删除文件所在的目录

[root@localhost test]# debugfs 
debugfs 1.41.12 (17-May-2010) 
debugfs: open /dev/mapper/VolGroup-lv_root 
debugfs: ls -d /usr/local/test/ 
2378807 (12) . 2098175 (4084) .. <2378808> (4072) my.txt

4、显示有<>尖括号的就是我们要找的文件Inode 号 执行logdump –i <2378808>,然后输入“quit”退出debugfs

debugfs: logdump -i <2378808> 
Inode 2378808 is at group 290, block 9438337, offset 2944 
Journal starts at block 16826, transaction 2237277 
No magic number at block 30648: end of journal. 
debugfs: quit

5、执行以下命令,进行恢复,bs与skip的值分别取自:block 9438337, offset 2944

dd if=/dev/mapper/VolGroup-lv_root of=/usr/local/test/my.txt bs=2944 count=1 skip=9438337

bs对应上面的offset后面的值,skip对应block后面的值

debugfs: quit 
[root@localhost test]# dd if=/dev/mapper/VolGroup-lv_root of=/usr/local/test/my.txt bs=2944 count=1 skip=9438337 
记录了1+0 的读入 
记录了1+0 的写出 
2944字节(2.9 kB)已复制,0.00989032 秒,298 kB/秒 
[root@localhost test]# ls 
my.txt

至此,刚删除的数据已恢复

拓展内容

linux dd命令

Linux dd命令用于读取、转换并输出数据。

dd可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。

参数说明:

    if=文件名:输入文件名,缺省为标准输入。即指定源文件。

    of=文件名:输出文件名,缺省为标准输出。即指定目的文件。

    ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
    obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
    bs=bytes:同时设置读入/输出的块大小为bytes个字节。

    cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。

    skip=blocks:从输入文件开头跳过blocks个块后再开始复制。

    seek=blocks:从输出文件开头跳过blocks个块后再开始复制。

    count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。

选项说明:

bs=<字节数>:将ibs(输入)与欧巴桑(输出)设成指定的字节数;
cbs=<字节数>:转换时,每次只转换指定的字节数;
conv=<关键字>:指定文件转换的方式;
count=<区块数>:仅读取指定的区块数;
ibs=<字节数>:每次读取的字节数;
obs=<字节数>:每次输出的字节数;
of=<文件>:输出到文件;
seek=<区块数>:一开始输出时,跳过指定的区块数;
skip=<区块数>:一开始读取时,跳过指定的区块数;
--help:帮助;
--version:显示版本信息。

参考技术B

linux的文件被rm删除是可以通过linux自带的文件恢复工具debugfs来进行恢复,但是只能恢复ext2文件系统的文件,不能恢复ext3文件系统的文件。


1,首先查看需要恢复的文件所在的文件系统

命令行模式下输入指令mount

[xuwangcheng14@root]# mount
/dev/xvda1 on / type ext2 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)

由上知,/dev/xvda1挂载在/下,即根目录,且文件系统是ext2


2,将要找回的文件所在的分区重新挂载成只读
(因为这样比较安全,可以防止因新的文件写入该分区而导致无法找回文件)

[xuwangcheng14@root]#  mount -n -o remount,ro /dev/xvda1

如果不能重新挂载,那么一定有用户正在使用该分区中的文件,我们可以使用指令:fuser -m -v /dev/xvda1来查看当前哪个用户正在使用该分区中的文件,然后使用fuser -k -m -v /dev/xvda1来杀死用户使用该分区的任何进程。


3,使用debugfs工具恢复文件

[xuwangcheng14@root]# debugfs /dev/xvda1
debugfs 1.42 (29-Nov-2011)
debugfs:  lsdel

进入debugfs模式后输入lsdel后可以看到被删除的文件信息

stat显示某个节点所对应的文件信息,

恢复文件使用dump 文件路径。


如果被删除的文件很多,那么通过lsdel可看出文件的时间,然后自己判断进行恢复。

参考技术C

1、 查看一下当前系统版本号,及文件系统格式

2、新建一个文件夹及文件my.txt,然后删除

3、运用,系统自还工具debugfs来修复 打开,刚刚被删除文件所在的分区,用ls 加-d参数显示刚刚删除文件所在的

4、显示有<>尖括号的就是我们要找的文件Inode 号 执行logdump –i <2378808>,然后输入“quit”退出

5、执行以下命令,进行恢复,bs与skip的值分

bs对应上面的offset后面的值,skip对应block后面的值

至此,刚删除的数据已恢复

linux dd命令

Linux dd命令用于读取、转换并输出数据。

dd可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。

参考技术D 我是今天才看到这条信息的,不过我还是希望你了解一下,对你以后有帮助的。
ext2文件系统用debugfs命令即可恢复;ext3文件系统只要数据块未被占用也能恢复,若发现得不及时,可能就恢复不了了。ext3文件系统恢复,可使用ext3grep软件,我曾使用这个软件恢复过数据,还是不错的。

Linux系统的rm命令太危险,一不小心就会删除系统文件。写一个shell脚本来替换系统的rm命令,

Linux系统的rm命令太危险,一不小心就会删除系统文件。写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时都要做一个备份,然后再删除。

假设有一个大的分区/data/,每次删除文件或者目录前,都要在/data/下面创建一个隐藏目录,以日期/时间命名,比如/data/.201802021054,然后把所有删除的文件同步到该目录下面,可以使用rsync -R把文件路径一同同步


答案:

#!/bin/bash
d=`date +%Y%m%d%H%M`
read -p "Are you sure delete the file or directory $1? y|n:"  c
if [ $c == "y" ] || [ $c == "Y"]
then
      mkdir /data/.$d
      rsync -aR $1/   /data/.$d
      /bin/rm -rf $1
elif [ $c == "n"] || [ $c == "N"]
then
      exit 0
else
     echo "Please input y or n"
fi

解析:首先声明一个变量$d,将日期命令(date +%Y%m%d%H%M)的执行结果赋值给变量d,这里用到了反引号(``),作用就是将反引号中命令的运行结果反馈出来。使用read -p 将输入结果赋值给变量$c。


          使用if进行判断,这里首先说明几个命令的作用,[]中括号里面是判断的条件,两边都要有空格,条件判断符“==”两边也要有空格, ||是或者的意思。那么,整段的含义是:如果$c全等于字符串y或者Y,则执行 mkdir 创建文件夹,执行rsync同步命令,最后执行删除命令。再如果,$c全等于字符串n或者N,则退出,否则(以上两种情况都不包含,输出echo“please input y or n”)。

         

         单独说明 rsync -aR $1/   /data/.$d。其实完整的写法应该是 rsync -aR $1/ /data/.$d/$1,但是这样写,如果$1的值为一个绝对路径,如:/tmp/1.txt,那么代入会发现

rsync -aR /tmp/1.txt  /data/.201802021122//tmp/1.txt。多了一个/会报错,所以省略了/$1,避免这种情况。


-------习题来源阿铭Linux--------

以上仅为个人理解,不正之处请指出,谢谢。

以上是关于Linux系统下不小心使用rm命令删除的文件能有办法恢复吗?的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统的rm命令太危险,一不小心就会删除系统文件。写一个shell脚本来替换系统的rm命令,

LINUX操作系统中,删除文件的命令是啥?

rm命令-每日Linux命令

如何从linux下删除文件夹

Linux学习总结(六十七)rm命令限制脚本

关于对linux命令rm -rf 的理解