2016-11-10 12 views
0

ls /foo/bar/ lrwxr-xr-x a1 -> ../../../a1 lrwxr-xr-x a2 -> ../../../a2 lrwxr-xr-x a3 -> ../../../a3たPerl:指定されたパス

このLSの縮小出力であるから、すべてのシンボリックリンクを一覧表示するファイル::検索::ルールを使用する方法。

私の目標: 1./foo/bar /に移動し、最新バージョンのa(シンボリックリンク)を探します。この場合、a3。 a3の内容を一時的な場所にコピーしてください

File::Find::Ruleを使用しようとしていますが、それを使ってすべてのシンボリックリンクを一覧表示する方法がわかりません。さまざまなGoogleサイトを読んで、シンボリックリンクに従う方法を説明していますが、リストには記載していません。私がこれまでに考え出した何

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

だけ何のファイル/ fooの/バーでのシンボリックリンクが存在しないので、これは空の配列を返します。 私も試しました my @files = File::Find::Rule->in($makeFilePath)->extras({follow =>1}); しかし、私はそれをリストするのではなく、シンボリックリンクに従うよう求めています。

答えて

4

はこれが現在のディレクトリに-lファイルテストを満たすすべてのファイルを検索しますFile::Find::Rule

use warnings 'all'; 
use strict; 

use File::Find::Rule; 

my $rule = File::Find::Rule->new; 

my @links = $rule->symlink->in('.'); 

print "@links\n"; 

で提供-X test synonymsからsymlinkメソッドを使用します。また、-Xを参照してください。手持ちのリンクのリストで

、あなたはターゲットファイルのタイムスタンプで、それを整理して、-Mファイルテストやstat(またはそのFile::stat名前によるインターフェース)を使用することができます。例えば、

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

他の多くの方法でリストを並べ替えることができます。 -Mを使用する場合はminが必要です。なんらかの理由でのタイムスタンプを使用したい場合は、代わりにlstatを使用してください。このモジュールでは、タイムスタンプを扱う方法としてmtimeが提供されていますが、検索のためのものであり、ソートには適していません。あなたが実際に最初のオブジェクトを作成する必要はありませんが、直接、一時ファイルのためのコアFile::Tempが有用であるが、物事は、コアFile::Copyを使用して移動/コピーするには

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

を行うことができます

は注意してください。

関連する問題