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是有用的