我想只打印最近的文件。
我的脚本:
#!/usr/bin/perl
#use strict;
#use warnings;
@files = <'/mnt/SESSIONS*'>;
foreach $file (@files) {
print $file . "\n";
}
输出:
/mnt/SESSIONS2018-12-18_14_00.log
/mnt/SESSIONS2018-12-18_14_15.log
/mnt/SESSIONS2018-12-18_14_30.log
/mnt/SESSIONS2018-12-18_14_45.log
/mnt/SESSIONS2018-12-18_15_00.log
我只需要最近的文件名/mnt/SESSIONS2018-12-18_15_00.log
。
你有个主意吗?
答案 0 :(得分:2)
注释中的先前建议将使您参考-M运算符/函数,该函数返回文件的修改时间(定义)-假定文件仅在使用时才被修改,之后再不修改。
您陈述问题的方式表明,您想要使用最新名称命名的文件-这样一来,仅使用内存中已存在的信息即名称本身就可以更快。
my ($latest) = sort { $b cmp $a } @files;
print "$latest\n";
所涉及的并且您可能想了解更多的东西是:
答案 1 :(得分:1)
这取决于您想要的...如果您认为文件名将始终按创建时的顺序排列,那么类似的方法将起作用:
my @files = <'/mnt/SESSIONS*'>;
my $latest;
foreach my $file (@files) {
$latest = $file if $file gt $latest;
}
print $latest;
或者,如果您想基于修改最后一个文件的时间(忽略文件名),可以执行以下操作:
my @files = <'/mnt/SESSIONS*'>;
my @latest = (undef, undef);
foreach my $file (@files) {
my $mod = -M $file;
if (!$latest[1] or $mod < $latest[1]) {
@latest = ($file, $mod);
}
}
print $latest[0];
不反对排序,但排序是平均情况O(n log n),而这种方法是O(n),并且仅保证遍历所有文件。当然,目录中的文件数量不太可能会影响性能,但这是一个考虑因素。
或者,如果您只想进行系统调用,则可以执行以下操作:
ls -A1t /mnt/SESSIONS* | head -1