gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:20:16 25 4
gpt4 key购买 nike

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

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

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

最终结果将是一个数组 @pl_paths , 其中 $pl_paths[0]类似于 /home/users/cheeseconqueso/maybe_not_newest_directory/surely_newest_file.pl
根据该结果,我想执行该文件,但我认为一旦找出排序后的数组,就可以在 $pl_paths[0] 中执行该文件,不会有问题。

有一个similar关于 SO 的问题,我一直在尝试修改以满足我的需要,但出于明显的原因,我现在在这里。

我用来在一个目录中获取最新文件 NAME 的代码是:

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";

最佳答案

您可以使用File::Find如果你想要一个核心模块,但我更喜欢使用 File::Find::Rule .

首先,我们可以找到所有 .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;

从那里,最新的名称在 $sorted_files[0]{name} .

如果你只想找到最上面的,其实没必要做一个完整的排序,但是我能想到的最好的解决方案涉及一些稍微高级的 FP,所以如果你觉得它看起来很奇怪,完全不用担心:
use List::Util 'reduce';
my ($top_file) = reduce { $a->{mtime} >= $b->{mtime} ? $a : $b }
@files_with_mtimes;

关于perl - 如何使用 Perl 在目录及其所有子目录中找到最新的 .pl 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7585145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com