如何通过运行 rm * 恢复我现在删除的文件?

Rav*_*avi 70 ubuntu data-recovery rm

我错误地在创建许多 c 程序文件的当前目录上运行了 rm * 。我从早上就一直在研究这些。现在我不能再抽出从早上开始创建文件的时间了。请问如何恢复。他们也不在回收站!

Tho*_*man 71

如果正在运行的程序仍然打开了被删除的文件,您可以通过/proc/[pid]/fd/[num]. 要确定是否是这种情况,您可以尝试以下操作:

$ lsof | grep "/path/to/file"
Run Code Online (Sandbox Code Playgroud)

如果上面给出了表单的输出:

progname 5383 user 22r REG 8,1 16791251 265368 /path/to/file               
Run Code Online (Sandbox Code Playgroud)

记下第二列中的 PID 和第四列中的文件描述符编号。使用此信息,您可以通过发出以下命令来恢复文件:

$ cp /proc/5383/fd/22 /path/to/restored/file
Run Code Online (Sandbox Code Playgroud)

如果您找不到带有 的文件lsof,您应该立即重新挂载包含只读文件的文件系统:

$ mount -o remount,ro /dev/[partition]
Run Code Online (Sandbox Code Playgroud)

或者完全卸载文件系统:

$ umount /dev/[partition]
Run Code Online (Sandbox Code Playgroud)

这样做的原因是,一旦文件被取消链接,并且没有剩余的硬链接到有问题的文件,底层文件系统可能会释放先前为已删除文件分配的块,此时这些块可能会被删除。分配给另一个文件并且它们的内容被覆盖。因此,如果要进行任何恢复,停止对文件系统的任何进一步写入对时间至关重要。如果文件系统是根文件系统,或者由于其他原因无法设为只读或卸载,则可能需要关闭系统(如果可能)并继续从可以保留目标文件的实时环境中恢复系统只读。

在阻止对文件系统的写入后,无需立即尝试进行实际恢复。为了安全起见,您可能需要备份文件系统以在以下位置执行实际恢复:

$ dd bs=4M if=/dev/[partition] of=/path/to/backup
Run Code Online (Sandbox Code Playgroud)

接下来的步骤现在取决于文件系统类型。假设典型的 Ubuntu 安装,您很可能有一个ext3ext4文件系统。在这种情况下,您可以尝试使用 进行恢复extundelete。可以在备份或原始设备上安全地尝试恢复,只要它未安装(或以只读方式安装)。不要尝试从实时文件系统中恢复。这很可能会使文件系统进入不一致的状态。

extundelete将尝试将它找到的任何文件还原到名为RECOVERED_FILES. 从备份中恢复所有已删除文件的典型用法是:

使用旧版本:

$ extundelete /path/to/backup --restore-all 
Run Code Online (Sandbox Code Playgroud)

对于较新的版本(例如 0.2.4),不要挂载您要从中恢复的设备(感谢 Ryan Lue):

$ extundelete /dev/<device-file> --restore-all
Run Code Online (Sandbox Code Playgroud)

而不是--restore-all,您可以尝试像--restore-file <path>或这样的选项--restore-directory <path>


Rav*_*avi 15

是的,我能够恢复我的文件。我还没有检查是否所有都恢复了,但是我检查过的一些已经恢复了。由于有许多文件可以通过该工具/命令恢复,我需要在这些文件中 grep 一些文本模式,看看哪些是我的。文件以不同的名称恢复(可能由系统生成)。我从另一个论坛得到了解决方案,命令是 photorec

sudo photorec
Run Code Online (Sandbox Code Playgroud)

这将打开一个基于文本的窗口。我遵循了说明,是的,它很棒。