如何使用Perl在目录及其所有子目录中找到最新的.pl文件?

如何使用Perl在目录及其所有子目录中找到最新的.pl文件?,perl,path,directory,file-search,datecreated,Perl,Path,Directory,File Search,Datecreated,如何使用Perl扫描整个目录的内容,包括其子目录的内容,并在其中找到最新的.pl文件 我想构建一个目录树中所有.pl文件的完整文件路径的排序数组/列表 因此,例如,如果我的基本目录是/home/users/cheeseconqueso/,我想搜索该目录中的.pl文件以及该路径中的任何子目录,然后按日期对.pl文件进行排序 最终的结果将是一个数组,@pl\u paths,其中$pl\u paths[0]类似于/home/users/cheeseconqueso/maybe\u not\u newe

如何使用Perl扫描整个目录的内容,包括其子目录的内容,并在其中找到最新的
.pl
文件

我想构建一个目录树中所有
.pl
文件的完整文件路径的排序数组/列表

因此,例如,如果我的基本目录是
/home/users/cheeseconqueso/
,我想搜索该目录中的
.pl
文件以及该路径中的任何子目录,然后按日期对
.pl
文件进行排序

最终的结果将是一个数组,
@pl\u paths
,其中
$pl\u paths[0]
类似于
/home/users/cheeseconqueso/maybe\u not\u newest\u directory/solidate\u newest\u file.pl

根据这个结果,我想执行这个文件,但我认为一旦我得到了排序的数组,在
$pl\u路径[0]
中执行这个文件就不会有问题了

有一个问题,所以我一直试图修改,以适应我的需要,但我现在在这里有明显的原因

我用于仅在一个目录中获取最新文件名的代码是:

opendir(my $DH, $DIR) or die "Error opening $DIR: $!";
my %files = map { $_ => (stat("$DIR/$_"))[9] } grep(! /^\.\.?$/, readdir($DH));
closedir($DH);
my @sorted_files = sort { $files{$b} <=> $files{$a} } (keys %files);
print $sorted_files[0]."\n";
opendir(my$DH,$DIR)或die“打开$DIR时出错:$!”;
我的%files=map{$\=>(stat($DIR/$\)[9]}grep(!/^\.\?$/,readdir($DH));
closedir($DH);
my@sorted_files=sort{$files{$b}$files{$a}(键%files);
打印$sorted\u文件[0]。“\n”;
如果您想要一个核心模块,您可以使用,但我更愿意使用

首先,我们可以在目录下找到所有
.pl
文件,其中包含

use File::Find::Rule;
my @files = File::Find::Rule->file
                            ->name('*.pl')
                            ->in($directory);
然后,让我们使用
map
将文件名与其修改时间关联起来:

my @files_with_mtimes = map +{ name => $_, mtime => (stat $_)[9] }, @files;
并按mtime对其进行排序:

my @sorted_files = reverse sort { $a->{mtime} <=> $b->{mtime} } 
                @files_with_mtimes;
使用核心模块。

和,您可以在从dir\u path开始的子树中获得扩展名为.pl的最新文件

#!/usr/bin/env perl

use v5.12;
use strict;
use File::Find::Rule;

my @files = File::Find::Rule->file()->name( '*.pl' )->in( 'dir_path' );

# Note that (stat $_ )[ 9 ] yields last modified timestamp
@files = 
   map { $_->[ 0 ] }
   sort { $b->[ 1 ] <=> $a->[ 1 ] }
   map { [ $_, ( stat $_ )[ 9 ] ] } @files;

# Here is the newest file in path dir_path
say $files[ 0 ];
#/usr/bin/env perl
使用v5.12;
严格使用;
使用File::Find::Rule;
my@files=File::Find::Rule->File()->name('*.pl')->in('dir_path');
#注意,(stat$9)[9]生成最后修改的时间戳
@文件=
映射{$\->[0]}
排序{$b->[1]$a->[1]}
映射{[$\,(stat$\[9]]}@files;
#这是path dir_path中的最新文件
表示$files[0];

映射排序映射链是一个典型的习惯用法:获取时间戳的速度很慢,因此我们只对每个文件执行一次,将每个时间戳及其文件保存在一个arrayref中。然后我们使用timestamp(比较每个arrayref的第二个元素)对新列表进行排序,最后我们放弃时间戳,只保留文件名。

我想您误读了问题中的某些内容。。。。我在找最新的文件,不是最大的file@CheeseConQueso哎呀!我会马上更新的。同样的想法也适用@Zaid它不能,另外一个好处是确保它不会被解释为代码块;这是一个hashref。在
map
旁边欺骗性地使用hashref,我想把它穿上可选的代码块卷发是个人喜好。
反向排序{f($a)f($b)}@list
也可以写成
排序{f($b)f($a)@list
#!/usr/bin/env perl

use v5.12;
use strict;
use File::Find::Rule;

my @files = File::Find::Rule->file()->name( '*.pl' )->in( 'dir_path' );

# Note that (stat $_ )[ 9 ] yields last modified timestamp
@files = 
   map { $_->[ 0 ] }
   sort { $b->[ 1 ] <=> $a->[ 1 ] }
   map { [ $_, ( stat $_ )[ 9 ] ] } @files;

# Here is the newest file in path dir_path
say $files[ 0 ];