0

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

This is a curtailed output of ls.

My goal: 1. Go to /foo/bar/ and find the latest version of a (which is a symbolic link). So in this case, a3. Copy the contents of a3 to a temp location

I am trying to use File::Find::Rule but I am unable to figure out how to use it to list all the symbolic links. Reading through various Google sites, I see people explaining how to follow the symbolic links but not to list them.

What I have figured out so far:

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

This returns an empty array because there there are no files only symbolic links in /foo/bar. I also tried my @files = File::Find::Rule->in($makeFilePath)->extras({follow =>1}); but I feel that is asks to follow the symbolic link rather than list them.

4

1 に答える 1

4

File::Find::Ruleで提供されている -X test synonymssymlinkのメソッドを使用します

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ファイル 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('.');

ものをコピー/移動するにはコアFile::Copyを使用しますが、一時ファイルにはコアFile::Tempが便利です。

于 2016-11-10T18:34:21.280 に答える