在 Linux 上恢复已删除的文件

在 Linux 上恢复已删除的文件

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

rm -rf /path/to/myfile

我怎样才能康复myfile?如果有一个工具可以做到这一点,我该如何使用它?

答案1

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

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. 确定文件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.
    
  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 文件

答案2

如果您知道已删除文件中的非常具体的模式,请使用grep在硬盘驱动器中搜索(也许浏览剪贴板来搜索粘贴的行,或者 猛拉):

grep -a -C 300 -F 'known fixed string in deleted file' /dev/sda > ~/recover

然后编辑~/recover以仅保留之前编辑的文件内容。并举例说明编辑器,这将是一个简单的任务。

嘿,如果 Unix 哲学中一切都是文件,那么是时候利用这一点了,不是吗?

说明

  • -a旨在 grep 甚至二进制数据
  • -C<NUM>指定输出上下文的行每场比赛之前和之后字符串的;你可以用来-B<NUM>包含行每场比赛前-A<NUM>包含行每场比赛结束后反而
  • -F固定串

另一种方法,使用潜在的剩余F文件描述符D

有一点机会,有时我可以用以下方法恢复已删除的文件:

#!/bin/bash

export LANG=C

if [[ ! $1 || $1 == -h || $1 == --help ]]; then
    echo -e "Usage:\n\n\t$0 '[path/]<file name>'"
    exit 1
fi

files=(
    $(file 2>/dev/null /proc/*/fd/* |
        grep "(deleted)'$" | 
        sed -r 's@(:.*broken\s+symbolic\s+link\s+to\s+.|\(deleted\).$)@ @g' |
        grep "$1" |
        cut -d' ' -f1
    )
)

if [[ ${files[@]} ]]; then
    for f in ${files[@]}; do
        echo "fd $f match... Try to copy this fd to another place quickly!"
    done
else
    echo >&2 "No matching fd found..."
    exit 2
fi

答案3

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

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

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

需要一点时间,但是当我不小心删除了一些我还没有提交的源代码时就成功了!

答案4

尽管这个问题已经解决并且已经存在几年了,但我想提一下测试盘公用事业。

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

相关内容