【问题标题】:How do I copy symbolic links in Perl?如何在 Perl 中复制符号链接?
【发布时间】:2010-09-30 00:31:44
【问题描述】:

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

【问题讨论】:

    标签: perl symlink


    【解决方案1】:

    根据您关于绝对与相对目标路径、目录层次结构等的用例,使用link 创建指向您要复制的符号链接的硬链接也可能已经足够了。 Perl 在许多平台上也支持创建硬链接,不需要额外的包。

    【讨论】:

      【解决方案2】:

      模块File::Copy::Recursive 负责处理。默认情况下,它将复制符号链接并尝试保留所有权。

      【讨论】:

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

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

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

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

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

       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

      【讨论】:

      • 谢谢。我没有注意到符号链接没有真正的权限。我需要考虑一下我多么需要改变所有者。
      • 还要注意,如果符号链接的内容是相对路径,那么如果$old_link和$new_link不在同一个目录下,它可能需要重写!跨度>
      猜你喜欢
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多