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很有用
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很有用