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

标签 perl path directory file-search datecreated

如何扫描整个目录的内容,包括其子目录的内容,并找到最新的 .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/

相关文章:

perl - Pod::Simple 没有输出

eclipse - Java构建路径问题

batch-file - 如何搜索用户文件夹,同时避免使用 DIR 挖掘得太深?

perl - Perl 中的轮询机制

perl - 代码深处使用的未声明变量的作用域是什么?

java - 获取服务器上的文件路径时出错

java - 为程序创建 .jar 文件

PHP 在网络共享上创建文件

php以递归模式对一个目录中的所有图像运行函数

perl - 如何为 GET 请求绕过 LWP 的 URL 编码?