有没有办法恢复我已删除但仍在某处打开的文件?

Nat*_*man 7 delete data-recovery

这个问题与如何恢复已删除的文件有关?但性质略有不同。

假设我~/something在文本编辑器中有一个名为open的文件。进一步假设我打开一个终端并运行以下命令,而文件仍在文本编辑器中打开:

rm ~/something
Run Code Online (Sandbox Code Playgroud)

这将删除文件。现在假设我改变了主意,想要取回文件。该文件在文本编辑器中仍处于打开状态,因此尚未从磁盘或文件系统中删除

有什么办法可以恢复吗?

elm*_*cha 9

我不知道是否有任何文本编辑器可以在您编辑文件时使文件保持打开状态。通常(即在 Emacs 中),文件被读入 RAM 中的缓冲区,然后文件被关闭。您只能在 RAM 中进行编辑。保存缓冲区时,文件将再次打开、写入和关闭。您可以使用ps auxw | grep your_editor查找编辑器的 PID,然后lsof -p your_PID查看仍然打开的文件。

另一方面,如果文件仍在编辑器的缓冲区中,则可以保存它。

但这不是您的问题,所以让我们假设您正在将其cat用作编辑器,并且该文件确实仍处于打开状态:

% cat >the_file.txt
Hello world!
^Z
zsh: suspended  cat > the_file.txt
% rm the_file.txt 
% ls -l the_file.txt
ls: cannot access the_file.txt: No such file or directory
Run Code Online (Sandbox Code Playgroud)

您可以使用lsof -n查看所有打开的文件并grep搜索您的文件名。

% lsof -n | grep the_file.txt
cat  2145  elmicha  1w  REG  9,1  13 108003357 /home/elmicha/tmp/the_file.txt (deleted)
Run Code Online (Sandbox Code Playgroud)

在第二列中,您可以看到cat命令的 PID 。您可以切换到 /proc 文件系统中的相应目录,并进入fd(文件描述符)子目录:

% cd /proc/2145/fd
% ls -l
total 0
lrwx------ 1 elmicha elmicha 64 2012-11-07 00:22 0 -> /dev/pts/4
l-wx------ 1 elmicha elmicha 64 2012-11-07 00:22 1 -> /home/elmicha/tmp/the_file.txt (deleted)
lr-x------ 1 elmicha elmicha 64 2012-11-07 00:22 15 -> /proc/4501/auxv
lrwx------ 1 elmicha elmicha 64 2012-11-07 00:22 2 -> /dev/pts/4
Run Code Online (Sandbox Code Playgroud)

现在您可以将“文件”复制1到另一个文件:

% cp 1 ~/tmp/the_old_file.txt
Run Code Online (Sandbox Code Playgroud)

看,它就在那里:

% cat ~/tmp/the_old_file.txt
Hello world!
Run Code Online (Sandbox Code Playgroud)