![在 Linux 上恢复已删除的文件](https://linux22.com/image/9877/%E5%9C%A8%20Linux%20%E4%B8%8A%E6%81%A2%E5%A4%8D%E5%B7%B2%E5%88%A0%E9%99%A4%E7%9A%84%E6%96%87%E4%BB%B6.png)
是否有命令可以恢复/取消删除已删除的文件rm
?
rm -rf /path/to/myfile
我怎样才能康复myfile
?如果有一个工具可以做到这一点,我该如何使用它?
答案1
有人在评论中提供的链接可能是您最好的机会。
这篇文章虽然看起来有点吓人,但实际上很容易理解。一般来说步骤如下:
使用 debugfs 查看文件系统日志
$ debugfs -w /dev/mapper/wks01-root
在 debugfs 提示符下
debugfs: lsdel
样本输出
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.
在 debugfs 中运行命令
debugfs: logdump -i <7536655>
确定文件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.
使用上面的 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
如果以上内容不适合您,我过去曾使用过恢复文件等工具,但它仅适用于图像文件。我在我的博客上的这篇文章中广泛介绍了这种方法,标题为:
答案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
如果不确定,请检查)。
需要一点时间,但是当我不小心删除了一些我还没有提交的源代码时就成功了!