Unix / Linux取消删除/恢复已删除的文件


124

是否有命令来恢复/取消删除已删除的文件rm

$ rm -rf /path/to/myfile

我该如何恢复myfile?如果有这样的工具,我该如何使用?


1
cyberciti.biz/tips/…可以提供帮助。在Stack Exchange中也更好。
fedorqui 2013年

1.这对于Unix&Linux更好。2.备份?

1
在执行任何操作之前,以只读方式挂载文件系统以确保数据不会被覆盖。另外,请看一下这篇文章:superuser.com/questions/170857/ext4-undelete-utilities

1
@EvanTeitelman您的意思是重新挂载只读比尝试在挂载文件时恢复文件更好?顺便说一句,midnightcommander(mc)方式,建议卸载datarecoverypros.com/recover-linux-midnightcommander.html
Aquarius Power

1
最好的解决方案是提前考虑并使用修订控制工具。
ctrl-alt-delor

Answers:


66

评论中某人提供的链接可能是您最好的机会。

Linux debugfs Hack:取消删除文件

尽管看起来有些吓人,但实际上还是很容易理解的。通常,步骤如下:

  1. 使用debugfs查看文件系统日志

    $ debugfs -w /dev/mapper/wks01-root
    
  2. 在debugfs提示符下

    debugfs: lsdel
    
  3. 样品输出

    Inode  Owner  Mode    Size    Blocks   Time deleted
    23601299      0 120777      3    1/   1 Tue Mar 13 16:17:30 2012
    7536655      0 120777      3    1/   1 Tue May  1 06:21:22 2012
    2 deleted inodes found.
    
  4. 在debugfs中运行命令

    debugfs: logdump -i <7536655>
    
  5. 确定文件索引节点

    ...
    ...
    ....
    output truncated
        Fast_link_dest: bin
        Blocks:  (0+1): 7235938
      FS block 7536642 logged at sequence 38402086, journal block 26711
        (inode block for inode 7536655):
        Inode: 7536655   Type: symlink        Mode:  0777   Flags: 0x0   Generation: 3532221116
        User:     0   Group:     0   Size: 3
        File ACL: 0    Directory ACL: 0
        Links: 0   Blockcount: 0
        Fragment:  Address: 0    Number: 0    Size: 0
        ctime: 0x4f9fc732 -- Tue May  1 06:21:22 2012
        atime: 0x4f9fc730 -- Tue May  1 06:21:20 2012
        mtime: 0x4f9fc72f -- Tue May  1 06:21:19 2012
        dtime: 0x4f9fc732 -- Tue May  1 06:21:22 2012
        Fast_link_dest: bin
        Blocks:  (0+1): 7235938
    No magic number at block 28053: end of journal.
    
  6. 使用上面的inode信息,运行以下命令

    # dd if=/dev/mapper/wks01-root of=recovered.file.001 bs=4096 count=1 skip=7235938
    # file recovered.file.001
    file: ASCII text, with very long lines
    

文件已恢复到recovered.file.001

其他选择

如果上述方法不适合您,我过去曾使用过诸如photorec恢复文件之类的工具,但是它仅适用于图像文件。我已经在我的博客中以以下标题广泛地介绍了这种方法:

如何从Fedora / CentOS / RHEL上的数码相机的SDD卡中恢复损坏的jpeg和mov文件


11
我尝试过debugfs -w /dev/sdb2lsdel0 deleted inodes found.
又说

5
使用extundeleteext3 / 4更容易,并且可能会得到相同的结果。
eadmaster 2015年

1
这可以恢复文件,但我收到了 @yUU T6 e 0 v' T 0。<#selinuxsystem_u:object_r:rpm_var_lib_t: s0 }y U T6.....尝试conv = ascii,conv = ibm和conv = ebcdic会产生相同的问题
codyc4321 2015年

2
lsdel:文件系统未打开,如何解决?
阿弥陀佛(Amitābha),2015年

3
我得到/dev/mapper/wks01-root: No such file or directory while opening filesystem你是/dev/mapper/wks01-root从哪里得到的?
MarkoAvlijaš17年

29

有时,我可以使用此脚本或答案中的下一个解决方案来恢复已删除的文件:

#!/bin/bash

if [[ ! $1 ]]; then
    echo -e "Usage:\n\n\t$0 'file name'"
    exit 1
fi

f=$(ls 2>/dev/null -l /proc/*/fd/* | fgrep "$1 (deleted" | awk '{print $9}')

if [[ $f ]]; then
    echo "fd $f found..."
    cp -v "$f" "$1"
else
    echo >&2 "No fd found..."
    exit 2
fi

还有一个有用的技巧:如果您知道已删除文件中的模式,请输入alt+ sys+ resuo以只读方式重新引导+重新安装,然后使用live-cd grep来搜索硬盘:

grep -a -C 500 'known pattern' /dev/sda | tee /tmp/recover

然后进行编辑/tmp/recover以仅保留以前的文件。

嘿,如果使用Unix原理全部是文件,是时候利用它了,不是吗?


5
grep即使文件系统仍然挂载,您基于解决方案的解决方案也非常聪明并为我工作。谢谢!
wchargin 2014年

我不明白grep解决方案如何为您工作,它仅输出二进制数据。这有什么用?
w00t

2
@ w00t当然,它“仅”吐出二进制数据。但是有时二进制数据恰好包含与我要查找的文件相对应的ASCII位。我想我不明白这个问题?
wchargin '16

@ w00t的诀窍是使用特定于该文件的搜索模式。grep命令将在每条匹配的行之前和之后占用500行,因此它仍然会吐出许多无关的数据,但是使用可以处理该问题的文本编辑器(例如Vim),可以很容易地从坏东西。您还可以通过另一个grep命令将其以管道方式过滤掉所有具有grep -av "[^[:print:]]"
不可

grep解决方案为我用修改:我做了sudo grep --line-buffered -ab "$PATTERN" /dev/sda1 | tee lines,得到了字节偏移(像123123123:line\n456456456:another\n...),然后做n=1000; sudo dd of=before if=/dev/sda1 ibs=1 skip=$[123123123-$n] count=$n,并n=1000; sudo dd of=after if=/dev/sda1 ibs=1 skip=123123123 count=$n用不同的n值。
Kirill Bulygin

21

arch对我有用的东西(仅适用于文本文件):

grep -a -C 200 -F 'Unique string in text file' /dev/sdXN

/dev/sdXN包含丢失文件的分区在哪里(mount如果不确定,请选中)。

需要一些时间,但是当我不小心删除了一些尚未提交的源代码时可以正常工作!


4
对程序员非常有用!通常,我们总是会丢失自己的代码。
pylover

1
告诉我这件事,我不小心碰到rm data/*.json python myFile.py而不是rm data/*.json && python myFile.py
威廉·贝克尔

2
谢谢队友,您只是帮助我恢复了一个我晚上花2个小时编写的文本文件。PS /dev/sdXN是用于文件系统的,对吗?我与df -T | awk '{print $1,$2,$NF}' | grep "^/dev"
Alex

我只看到文件的二进制文件。有没有办法将其转换为普通格式?
silgon

grep: conflicting matchers specified
felwithe

10

尽管此问题已经解决并且已经使用了几年,但我想提一下testdisk实用程序。

本教程中很好地说明了如何使用testdisk恢复文件。要恢复文件,请运行testdisk /dev/sdX并选择分区表类型。之后,选择[ Advanced ] Filesystem Utils,然后选择您的分区并选择[Undelete]。现在,您可以浏览并选择已删除的文件,然后将其复制到文件系统中的另一个位置。


它没有看到我的/ dev / nvme0n1p2
h22

6

上周我遇到了同样的问题,我尝试了很多程序,例如debugfs,photorec,ext3grep和extundelete。ext3grep是恢复文件的最佳程序。语法非常简单:

ext3grep image.img --restore-all

要么:

ext3grep /dev/sda3 --restore-all --after date -d '2015-01-01 00:00:00' '+%s' --before `date -d ‘2015-01-02 00:00:00’ ‘+%s’

该视频是一个迷你教程,可以为您提供帮助。


6

一种替代方法可能是使用del而不是rm用于删除:

http://fex.belwue.de/fstools/del.html

del 具有取消删除功能,并且可以与任何文件系统一起使用。

当然,如果您已经使用“不带任何囚犯” rm删除了文件,这不是解决方案:-}


1
正如您已经说过的那样,这不是一个答案,但是感谢您介绍该del 命令。
pylover '16

5

通过外部接口连接驱动器

  1. 安装
  2. umount /dev/{sd*}
  3. extundelete --restore-all /dev/{sd*}
  4. 结果进入引导驱动器上的主文件夹
  5. 加分:为此编写一个GUI

有关更多信息,请参见此链接:使用extundelete取消删除ext4上刚刚删除的文件


2
拒绝投票的人,请解释一下为什么您认为extundelete不是一个好选择?
webminal.org 2015年

2
真好!感谢您的发布。extundelete对我来说是一个新工具。我今天使用了它,发现它非常有用。国际海事组织比公认的答案更有帮助。我要添加到此答案中以对其稍做改进的唯一事情是(1)重申其他答案中的指示,即一旦人们意识到文件被错误删除,就应该关闭受影响的计算机,以及(2)从包括extundelete实用程序的liveCD或liveUSB OS(例如Kali Linux)启动(我发现许多其他liveCD,例如Debian Jessie都没有在其安装媒体上包含此实用程序)。
Osteoboon


1

我不同意这是不可能的,只是非常非常困难,我也从未在Linux上做到过:

删除文件后,它们实际上并没有被删除。发生的情况是它们在硬盘驱动器上的空间已被重置,因此,如果计算机尝试在其中写入数据,则不会有任何抱怨。通常,您认为已删除的硬盘驱动器上的数据可能会在一年后出现。至少,这是我在Windows计算机上的经验。我不确定它是否可以从Linux上的命令行以相同的方式工作,但我不确定,但是您可能需要单独的Live CD来打开该分区,而且也无法保证文件仍然存在。我已经使用零假设恢复在Windows XP上执行了几次。如果您足够努力的话,我相信周围也有类似的工具。


根据情况,这可能是100%不可能的。它可能会或可能不会起作用,但是您永远无法保证。
klutt

0

删除文件时,该文件的inode表中的链接计数减少一。在Unix中,当链接数降至0时,该文件的数据块被标记为空闲,并且通常会丢失对这些数据块的引用。我只是从@fedorqui的评论中发现,也许可以通过某种方式访问​​这些块,但这仅适用于ext3文件系统。

保留文件的一种方法是编写一个函数,该函数使您可以文件移动到回收区(让我们说$HOME/.trash),并从那里恢复所需的文件。该函数可以别名为rm。您可以安排cron作业以删除垃圾箱区域中已存在一定天数的文件。


0

这可能为您中的某些人省去麻烦。
如果您曾经使用gedit编辑该文件,则默认情况下将创建该文件的副本。
例如,假设我们意外删除了“ myfile.txt”。
在用于包含刚删除的文件的文件夹中,使用以下命令,您将在其中恢复副本:
ls | grep 'myfile.txt~'
运气好的话,您将找到它,然后:
cp 'myfile.txt~' 'myfile.txt'
我刚刚使用此方法恢复了文件。祝你好运!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.