仅打印最近的文件

时间:2018-12-18 14:15:52

标签: perl

我想只打印最近的文件。

我的脚本:

#!/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

你有个主意吗?

2 个答案:

答案 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