Распечатать только недавний файл - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу напечатать только последний файл в репертуаре.

Мой скрипт:

#!/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 голосов
/ 18 декабря 2018

Предыдущие предложения в комментариях ссылаются на оператор / функцию -M, которая возвращает (определение) время изменения файла - что предполагает, что файлы изменяются только тогда, когда они используются, чем никогда не изменялись после этого.

То, как вы формулируете свою проблему, предполагает, что вам нужен файл с именем с самым последним именем, и это ускоряет использование только той информации, которая у вас уже есть в памяти, а именно самих имен.

my ($latest) = sort { $b cmp $a } @files;
print "$latest\n";

Упомянутые вещи, о которых вы, возможно, захотите прочитать подробнее:

0 голосов
/ 18 декабря 2018

Это зависит от того, что вы хотите ... если вы можете принять как должное, что имя файла всегда будет в том порядке, в котором оно было создано, тогда будет работать что-то вроде этого:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...