在Perl中如何复制符号链接?

6
在Perl程序中如何复制一个符号链接(而不是指向的文件),同时保留所有符号链接属性(例如所有者和权限)?
3个回答

9
在Perl中,您可以使用readlink()函数查找符号链接的目标。

您还可以使用lstat()函数读取符号链接的权限(与stat()不同,后者将读取符号链接指向的文件的详细信息)。

实际上,在没有额外帮助的情况下无法设置新符号链接的所有权,因为Perl不公开lchown()系统调用。对此,您可以使用来自CPAN的Perl Lchown模块。

假设有足够的权限(注意:未经检查的代码)

 use Lchown;
 my $old_link = 'path to the symlink';
 my $new_link = 'path to the copy';

 my $dst = readlink($old_link);
 my @stat = lstat($old_link);

 symlink $dst, $new_link;
 lchown $stat[4], $stat[5], $new_link;  # set UID and GID from the lstat() results

您不需要担心符号链接的权限 - 它们始终显示为-rwxrwxrwx


谢谢。我没有注意到符号链接没有真正的权限。我需要考虑一下我需要所有者更改的程度有多严重。 - splintor
1
请注意,如果符号链接的内容是一个相对路径,则如果$old_link和$new_link不在同一目录中,它可能需要重写! - Alnitak

4
模块File::Copy::Recursive可以解决这个问题。默认情况下,它将复制符号链接并尝试保留所有权。

1
谢谢指针。我在我的发行版中没有它,需要考虑是否要添加此模块。 我还看到源代码中文件的所有者未被处理。我需要重新思考它对我有多重要。 - splintor
我同意splintor的观点 - 虽然这个方法可行,但该模块并不在默认安装中,因此如果您想避免用户需要安装依赖关系,则不是一个好的解决方案。 - JosephH

0

根据您的使用情况,涉及绝对路径与相对目标路径、目录层次结构等,使用link创建到要复制的符号链接的硬链接可能已经足够了。无需额外的软件包,Perl在许多平台上也支持创建硬链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接