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



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});但我觉得它要求遵循符号链接而不是列出它们。

使用File::Find::Rule

中提供的-X测试同义词的symlink方法
use warnings 'all';
use strict;
use File::Find::Rule;
my $rule = File::Find::Rule->new;
my @links = $rule->symlink->in('.');
print "@linksn";

查找当前目录中满足-l文件测试的所有文件。

有了手头的链接列表,您可以使用-M文件test或stat(或其file::stat by-name接口),根据目标文件的时间戳对其进行排序。例如
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('.');

复制/移动的东西使用core File:: copy,而对于临时文件core File::Temp是有用的

最新更新