unlink
不会删除该文件;它只是删除名称和名称的链接。 unlink
可以撤消吗?
open(my $fh, ">", undef) || die;
print $fh "foo";
# This does not work
link($fh,"/tmp/bar") || die;
未链接文件的打开文件句柄是否可以链接到文件?
答案 0 :(得分:3)
如果可行,您可以将打开模式('>'
)更改为可读/写。然后,当您需要恢复文件时,您可以使用文件句柄将其打印到新打开的文件中,如果需要,即使使用相同的名称。
open my $fh, '+>', $file;
say $fh "line 1";
unlink $file;
say $fh "more lines";
seek $fh, 0, 0;
open my $fh_rec, '>', $file or die "Can't open $file (again): $!";
print $fh_rec $_ while <$fh>;
这不是所要求的,但它恢复了文件内容和访问权限
它。进一步打印到$fh
会使新$file
不同步,因此可以在完成写入(恢复文件)或将打印切换到$fh_rec
时完成此操作(然后{ {1}})。
恢复文件的另一种方法是使用操作系统,如果它使用close $fh
并公开文件句柄。然后可以从/proc
复制数据。要识别/proc/PID/fd/N
,可以使用N
扫描fd/
(少数)ls -l
中的所有链接,因为删除的文件名称后应该有(deleted)
。
此外,lsof -p PID
列出了给定进程的所有打开文件描述符。已删除文件的文件包含(deleted)
。 (lsof +L1 -p PID
仅输出已删除的条目,但仍有不少。)从此输出中,我们可以读取该文件描述符,然后从/proc/PID/fd/N
复制数据。这样我们也可以获得inode编号,也可以用来恢复文件。
答案 1 :(得分:0)
这些答案说:'不,不是一般的,绝对不是所有的Unices':
Relinking an anonymous (unlinked but open) file
https://serverfault.com/questions/168909/relinking-a-deleted-file
从打开的文件句柄中复制内容可能有效。