是否可以恢复在Linux中rm删除的文件?


8

如果您未按Shift键,则可以在垃圾箱中找到已删除文件的Windows ,

rm -f在linux中删除的文件呢


3
Windows已经将其称为“回收站”已有10多年了。当您按下Delete键时,它会明确表示正在移动文件,而不是删除文件。rm取消与文件关联的索引节点的链接。
克里斯·S

Answers:


13

要记住的第一件事是-停止在文件系统上进行任何进一步的写活动。

然后,您可以尝试使用一些工具来查看文件系统,并尝试在已删除的节点中查找数据。' extundelete'是sourceforge的一种这样的工具。

extundelete是一个实用程序,可以从ext3ext4分区中恢复已删除的文件。ext3文件系统是使用Linux时最常见的文件系统,而ext4是其继任者。extundelete使用存储在分区日志中的信息来尝试恢复已从分区中删除的文件。无法保证任何特定文件都将无法删除,因此请务必尝试建立一个良好的备份系统,或者在恢复文件后至少放置一个备份系统!


3
没有更多的写作不能被强调。它不是内置的,因此“恢复删除”是恢复软件在文件系统用以后的写操作覆盖数据之前重新组装其余部分的问题。
杰里米·M

2

第一步是尝试为根驱动器使用的文件系统取消删除工具。

如前所述,ext3grep和extundelete是ext文件系统系列的工具。

根据要恢复的文件类型,另一种选择是在驱动器上运行文件雕刻程序。这将比上述实用程序花费更长的时间。

最重要的是我为此使用的一种选择。

如果您碰巧知道文件中的某个字符串,则最后的选择是在十六进制编辑器中打开驱动器并搜索该字符串。

根据您的设置,您的窗口管理器可能会提供回收站/垃圾桶。

归根结底,完美的备份系统设置绝对无可替代。找到一个能胜任工作的工作,而无需您触摸它并进行设置。从长远来看,您将节省很多时间,麻烦和痛苦。


1

我将尝试一下ext3grep:
http ://www.xs4all.nl/~carlo17/howto/undelete_ext3.html
。在开始之前,您必须先卸载分区。

高温超导


0

由于undelete_ext3似乎不见了,这里是一个不起眼的bash脚本,它帮助我恢复了一些使用extundeletedebugfs无法获得的文件。解决方案共享。

您可以预先设定要查看的块列表,请参见PRESEED。每行占用一个块号。如果您不假装,将搜索所有块,这是默认设置。

  • 对于每个块,将针对gzip内容探查第一个字节。
  • 如果成功,则将问题所在的块进行gunzip处理,以进一步探测字节257处的“ ustar”字符串,并标记一个tar存档。
  • 最后,提取与文件模式匹配的数据(使用tar的通配符选项的后缀路径样式),并将其greped为某个字符串。有关此信息,请参见变量FILE_IN_TARFIT_CONTENT
  • 如果找到,请保存文件。

由于您可能会有不同的用例,因此这可能会为您提供一个框架来作为您自己过滤的基础。寻找其他文件类型时,您肯定需要调整值。

样本调用: ./ext-undelete-tar-gz.sh devimage found_files/

#!/bin/bash

# Brute force (linear) search specific tar files with
# certain contents on ext2 / ext3 / ext4 devices or files
#
# .. this is a last resort if extundelete and/or debugfs
#    did not find what you were looking for and limited
#    in that recoverable data must not have been stored
#    in fragments, i.e. non-sequentially

[[ -n "$2" ]] || {
    echo "usage: $0 [ device | imagefile ] "\
    "[ destdir_for_recovered_data ] "\
    "[ max_blocks_to_search (optional) ]" 
    exit 1
}

IMG=$1
DEST=$2
TMP=/dev/shm/cand.tmp
PRESEED=/dev/shm/cand.list

GZMAGIC=$(echo -e "\x1f\x8b\x08")
TARMAGIC=$(echo -e "ustar")

# max bytes to read into $TMP when a .tar.gz has been found
LEN=$((160*1024))

# pick $TMP for recovery based on matched strings..
FILE_IN_TAR="debian/rules" # ..in the tar index (suffix-search)
FIT_CONTENT="link-doc="    # ..within FILE_IN_TAR matches

# determine FS parameters
BLOCKS=$(tune2fs -l $IMG | grep -Po "(?<=^Block count:).*" | xargs)
    BS=$(tune2fs -l $IMG | grep -Po "(?<=^Block size:).*"  | xargs)
LEN=$((LEN/BS))

function _dd     { dd     $@ 2>/dev/null ; }
function _gunzip { gunzip $@ 2>/dev/null ; }
function _tar    { tar    $@ 2>/dev/null ; }

function inspect_block {
    bnum=$1

    if _dd if="$IMG" skip=$bnum bs=$BS count=1 | tee "$TMP" \
    | _dd bs=1 count=3 \
    | grep -qF "$GZMAGIC" 
    then
        if _gunzip -c "$TMP" \
        | _dd bs=1 count=5 skip=257 \
    | grep -qF "$TARMAGIC"
        then
            _dd if="$IMG" skip=$((bnum+1)) bs=$BS count=$((LEN-1)) >> "$TMP"
            echo -n found $bnum.tar.gz

            if _tar xzf "$TMP" -O --wildcards *"$FILE_IN_TAR" \
            | grep -qF "$FIT_CONTENT"
            then
                echo " ..picked, stripping trailing garbage:"
                exec 3>&1
                gunzip -c "$TMP" 2>&3 | gzip > $DEST/$bnum.tar.gz
                exec 3>&-
            else
                echo
            fi
        fi
    fi

    echo -ne "$((bnum+1)) / $BLOCKS done.\r" >&2
}


if [[ -f "$PRESEED" ]]
then
    while read bnum
    do inspect_block $bnum
    done <"$PRESEED"
else
    for (( bnum = 0 ; bnum < ${3:-$BLOCKS} ; bnum++ ))
    do inspect_block $bnum
    done
fi | gzip >"$PRESEED.log.gz"

echo
  • 注意到错误的删除后,请停止使用有问题的文件系统。
  • 该脚本可能在大型文件上失败,它不会解析文件系统的更高级别的结构。
  • 基本上,现代文件系统并非旨在可靠地恢复未链接的数据,因此不能保证恢复丢失的数据。
  • 在文件系统的备份映像上进行操作。

如果文件大于12个块,那么我认为您很可能会在数据块之间找到间接块。在这种情况下,简单地顺序读取将产生垃圾输出。但是,如果您能够找到间接块,则可以恢复文件的其余部分(当然,除非它被覆盖)。
kasperd '16
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.