【问题标题】:Perl: How to use File::Find::Rule to list all symbolic links from a given pathPerl:如何使用 File::Find::Rule 列出给定路径中的所有符号链接
【发布时间】:2017-03-24 21:05:57
【问题描述】:

ls /foo/bar/ lrwxr-xr-x a1 -> ../../../a1 lrwxr-xr-x a2 -> ../../../a2 lrwxr-xr-x a3 -> ../../../a3

这是 ls 的缩减输出。

我的目标: 1. 转到 /foo/bar/ 并找到最新版本的 a(这是一个符号链接)。所以在这种情况下,a3。将 a3 的内容复制到临时位置

我正在尝试使用File::Find::Rule,但我无法弄清楚如何使用它来列出所有符号链接。阅读各种谷歌网站,我看到人们解释如何遵循符号链接,但没有列出它们。

到目前为止我的发现:

my $filePath = "/foo/bar"; my @files = File::Find::Rule->file->in(filePath);

这将返回一个空数组,因为 /foo/bar 中没有文件,只有符号链接。 我也试过 my @files = File::Find::Rule->in($makeFilePath)->extras({follow =>1}); 但我觉得这是要求遵循符号链接而不是列出它们。

【问题讨论】:

    标签: perl file find rule file-find


    【解决方案1】:

    使用File::Find::Rule中提供的-X test synonyms中的symlink方法

    use warnings 'all';
    use strict;
    
    use File::Find::Rule;
    
    my $rule = File::Find::Rule->new;
    
    my @links = $rule->symlink->in('.');
    
    print "@links\n";
    

    这会在当前目录中找到所有满足-l 文件测试的文件。另见-X

    有了手头的链接列表,您可以使用-M 文件测试或stat(或其File::stat 按名称接口),按目标文件的时间戳对其进行排序。例如

    use List::Util 'max';
    my %ts_name = map { (stat)[9] => $_ } @links;
    my $latest = $ts_name{ max (keys %ts_name) };
    

    还有其他方法可以对列表进行排序/过滤/等。如果你使用-M,那么你需要min。如果您出于某种原因想要链接本身的时间戳,请改用lstat。该模块还提供了一个mtime 方法来处理时间戳,但它是用于搜索的,不适合排序。

    注意,你不必先实际创建一个对象,而是可以直接做

    use File::Find::Rule;
    my @links = File::Find::Rule->symlink->in('.');
    

    要复制/移动内容,请使用核心 File::Copy,而对于临时文件,核心 File::Temp 很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多