Perl:如何使用 File::Find::Rule 列出给定路径中的所有符号链接

Perl: How to use File::Find::Rule to list all symbolic links from a given path

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

这是 ls 的缩减输出。

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

我正在尝试使用 File::Find::Rule,但我不知道如何使用它来列出所有符号 link。通过阅读各种 Google 站点,我看到人们解释如何遵循符号 links 而不是列出它们。

到目前为止我想通了:

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

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

使用 -X test synonyms provided in File::Find::Rule

中的 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.

手头有link的列表,可以使用-M文件测试或stat (or its File::stat按名称接口),按[=]的时间戳排序36=]目标文件。例如

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

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

请注意,您不必先实际创建一个对象,而是可以直接执行

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

对copy/move东西用核心File::Copy, while for temporary files core File::Temp很有用