这个问题与如何恢复已删除的文件?但本质上略有不同。
假设我在文本编辑器中有一个名为 open 的文件~/something
。进一步假设我打开终端并在文件仍在文本编辑器中打开时运行以下命令:
rm ~/something
这将删除该文件。现在假设我改变了主意,想恢复该文件。该文件仍在文本编辑器中打开,所以它还没有从磁盘或文件系统中删除。
有没有什么办法可以恢复它?
答案1
我不知道是否有任何文本编辑器会在您编辑文件时保持文件打开。通常(即在 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
您可以使用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)
在第二列中,您可以看到命令的 PID cat
。您可以切换到 /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
现在您可以将“文件”复制1
到另一个文件:
% cp 1 ~/tmp/the_old_file.txt
你看,它就在那里:
% cat ~/tmp/the_old_file.txt
Hello world!
答案2
只需将文件保存在文本编辑器中即可。应该效果很好。
顺便说一句,当您在编辑器中打开文件并尝试关闭窗口时,系统通常会提示您“未保存?”消息,因为文本编辑器也会注意到该文件已被删除并且当前“未保存”(至少在该位置)。
(nitstorm,请不要使用评论来回答问题;)