unlink
不会删除已打开的文件,它只是删除文件名和链接。那么,unlink
可以被撤销吗?
open(my $fh, ">", undef) || die;
print $fh "foo";
# This does not work
link($fh,"/tmp/bar") || die;
可以将指向未链接文件的打开文件句柄链接到文件吗?
'>'
)更改为读/写模式。然后,当您需要恢复文件时,您可以使用文件句柄将其打印到新打开的文件中,即使需要使用相同的名称。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
(然后也关闭$fh
)。
/proc
并公开文件句柄,则可以从/proc/PID/fd/N
中复制数据。要识别N
,可以扫描fd/
中的所有链接(很少)以及ls -l
,因为删除的文件应该在其名称后面带有(已删除)
。lsof -p PID
列出给定进程的所有打开文件描述符。对于已删除的文件,它们随后有(已删除)
。(用lsof +L1 -p PID
只输出已删除的条目,仍然相当多。) 从此输出中,我们可以读取文件描述符,然后从/proc/PID/fd/N
复制数据。这样我们还可以获取i节点号,也可以用于恢复文件。https://serverfault.com/questions/168909/relinking-a-deleted-file
从打开的文件句柄中复制内容可能会起作用。
rw
模式打开,我发布的内容就有效(或者说——怎么可能无效呢?)。当然,它不会还原原始链接。 - zdim