如何使用Perl在目录及其所有子目录中找到最新的.pl文件?
如何使用Perl扫描整个目录的内容,包括其子目录的内容,并在其中找到最新的如何使用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
.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 ];