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

pyl*_*ver 167 linux data-recovery deleted-files

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

$ rm -rf /path/to/myfile
Run Code Online (Sandbox Code Playgroud)

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

slm*_*slm 89

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

Linux debugfs Hack:取消删除文件

这篇文章虽然看起来有点吓人,但实际上相当直接。一般来说,步骤如下:

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

    $ debugfs -w /dev/mapper/wks01-root
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在 debugfs 提示符下

    debugfs: lsdel
    
    Run Code Online (Sandbox Code Playgroud)
  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.
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在 debugfs 中运行命令

    debugfs: logdump -i <7536655>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 确定文件 inode

    ...
    ...
    ....
    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.
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

文件已恢复到recovered.file.001.

其他选项

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

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

  • 我尝试使用`debugfs -w /dev/sdb2`,但`lsdel` sais:`0 已删除的inode found。` (21认同)
  • 这不适用于 ext3 或 ext4,因此不幸的是它毫无用处。debugfs 手册指出:“此命令对于从 ext2 文件系统的意外文件删除中恢复很有用。不幸的是,如果使用 ext3 或 ext4 删除文件,则该命令对此无用,因为 inode 的数据块不再可用inode 释放后。” (9认同)
  • 对于 ext3/4,使用 `extundelete` 更容易,并且可能会导致相同的结果。 (7认同)
  • 我得到 `/dev/mapper/wks01-root: No such file or directory while opening filesystem` 你从哪里得到这个 `/dev/mapper/wks01-root`? (7认同)
  • lsdel:文件系统未打开,如何解决? (5认同)
  • [photorec 目前可以恢复至少 483 种不同的文件类型](http://www.cgsecurity.org/wiki/File_Formats_Recovered_By_PhotoRec),包括大量档案、办公类型文件和许多“杂项”文件,并且您可以添加您的也拥有“自定义签名”。由于它是仅照片恢复程序,因此显然发生了很大变化。 (2认同)
  • `debugfs` 不适用于使用 Ubuntu18.04LTS 的 ext4 日志系统。 (2认同)

Gil*_*not 42

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

#!/bin/bash

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

f=$(file 2>/dev/null /proc/*/fd/* | awk '$NF == "(deleted)"{print $(NF-1)}')

if [[ $f ]]; then
    echo "fd $f found..."
    cp -v "$f" "$1"
else
    echo >&2 "No fd found..."
    exit 2
fi
Run Code Online (Sandbox Code Playgroud)

还有另一个有用的技巧:如果您知道已删除文件中的模式,请键入alt+ sys+resuo以只读方式重新启动+重新挂载,然后使用 live-cd,用于grep在硬盘驱动器中搜索:

grep -a -C 500 'known pattern' /dev/sda | tee /tmp/recover
Run Code Online (Sandbox Code Playgroud)

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

嘿,如果在 unix 哲学中所有的都是文件,那么是时候利用这一点了,不是吗?

  • 您的基于 `grep` 的解决方案非常聪明并且对我有用,即使文件系统仍然挂载。谢谢! (10认同)
  • 我不明白 grep 解决方案如何为您工作,它仅输出二进制数据。这有什么用? (2认同)
  • @w00t 当然,它“仅”输出二进制数据。但有时二进制数据恰好包含与我要查找的文件对应的 ASCII 位。我想我不明白这个问题? (2认同)
  • @w00t 技巧是使用特定于该文件的搜索模式。grep 命令会取出每个匹配行之前和之后的 500 行,因此它仍然会吐出很多不相关的数据,但是使用可以处理这些数据的文本编辑器(例如 Vim),很容易从坏事。您还可以通过另一个 grep 命令通过管道过滤掉所有包含不可打印字符的行:`grep -av "[^[:print:]]"` (2认同)

Wil*_*ker 40

arch给出了对我有用的内容(仅适用于文本文件):

grep -a -C 200 -F 'Unique string in text file' /dev/sdXN
Run Code Online (Sandbox Code Playgroud)

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

需要一点时间,但是当我不小心删除了一些我尚未提交的源代码时起作用了!

  • 对程序员很有用!通常,我们总是丢失自己的代码。 (7认同)
  • 谢谢伙计,你刚刚帮我恢复了一个我晚上花了 2 个小时写的文本文件。PS `/dev/sdXN` 是针对文件系统的吧?我用`df -T | 找到了我的 awk '{打印 $1,$2,$NF}' | grep "^/dev"` (3认同)
  • 告诉我吧,我不小心跑了 `rm data/*.json python myFile.py` 而不是 `rm data/*.json &amp;&amp; python myFile.py` (2认同)

NoU*_*wed 16

虽然这个问题已经解决了几年,但我想提一下testdisk实用程序。

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


int*_*ika 15

恢复工具 - 命令行:

恢复工具 - GUI:

信息:

根据我的个人经验,我使用 ufs-explorer 和 photorec 取回我的数据

(1) = 非开源,非免费

(2) = 非开源,免费

(3) = 开源且免费

(4) = 支持 NTFS

(5) = 具有目录结构功能


资料来源:Linuxhacks.org
披露:我是 Linuxhacks.org 的所有者


小智 10

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

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

del 具有取消删除功能并适用于任何文件系统。

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

  • 不是您已经说过的答案,但感谢您介绍 `del` 命令。 (4认同)

小智 7

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

ext3grep image.img --restore-all
Run Code Online (Sandbox Code Playgroud)

或者:

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'`
Run Code Online (Sandbox Code Playgroud)

该视频是一个可以帮助您的迷你教程。


小智 6

通过外部接口连接驱动器

  1. umount /dev/{sd*}
  2. extundelete --restore-all /dev/{sd*}
  3. 结果转到启动驱动器上的主文件夹
  4. 加分:为此编写一个 GUI

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

  • 好的!感谢发布。extundelete 对我来说是一个新工具。我今天使用了它,发现它非常有用。IMO 比公认的答案更有帮助。我要添加到此答案以稍微改进它的唯一事项是(1)重申其他一些答案中的说明,即一旦意识到文件被错误删除,就应关闭受影响的计算机,以及(2)从 liveCD 或 liveUSB 操作系统(如 Kali Linux)启动,其中包含 extundelete 实用程序(我发现许多其他 liveCD,如 Debian Jessie 在其安装介质中不包含此实用程序)。 (3认同)

Alb*_*eri 6

使用 ext4magic 恢复已删除的文件

阅读来源:https ://wiki.archlinux.org/title/File_recovery#TestDisk_and_PhotoRec

Ext4magic 是另一个用于 ext3 和 ext4 文件系统的恢复工具。

要特别小心:

  • 您必须位于其他位置,而不是位于您尝试恢复的 HDD 中。最好的方法是克隆您要恢复的硬盘,这样您就可以尝试不同的方法。
  • 您不应再在要恢复的光盘中写入内容。
  • 此方法仅适用于 ext3 和 ext4 文件系统,因此请在开始之前检查您正在使用的文件系统。

不克隆 HDD 的示例:

在开始之前,请使用上述命令检查您拥有的文件系统:

$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
dev            devtmpfs  3,9G     0  3,9G   0% /dev
run            tmpfs     3,9G  1,8M  3,9G   1% /run
/dev/sda2      ext4      458G  151G  284G  35% /
tmpfs          tmpfs     3,9G  4,3M  3,9G   1% /dev/shm
tmpfs          tmpfs     3,9G   56M  3,8G   2% /tmp

Run Code Online (Sandbox Code Playgroud)

确定您使用的是 ext3 或 ext4 后,继续插入外部硬盘驱动器并从外部硬盘打开终端

要恢复过去 24 小时内删除的所有文件:

ext4magic /dev/sdXY -r
Run Code Online (Sandbox Code Playgroud)

要恢复目录或文件:

ext4magic /dev/sda2 -f path/to/lost/file -r
Run Code Online (Sandbox Code Playgroud)

小 R 标志 -r 只会恢复未被覆盖的完整文件。要恢复损坏的文件(部分覆盖的文件),请使用大 R 标志 -R。这也将恢复未删除的文件和空目录。

默认目标是 ./RECOVERDIR,可以通过添加选项 -d path/to/dest/dir 来更改。

如果目标目录中存在文件,则新文件将使用尾随井号 # 重命名。

要恢复“五天前”之后删除的文件:

ext4magic /dev/sdXY -f path/to/lost/file -a $(date -d -5days +%s) -r
Run Code Online (Sandbox Code Playgroud)