Получить последние данные из каталога

Нажмите kдля отключения и ввода PID и сигнала для отключения.

1
24.06.2021, 11:10
2 ответа

Сортировка глобуса по отметке времени модификации каждого файла с помощью функции stat.

напр.

вместо:

for my $file ( glob($files) ) {

использовать:

for my $file ( sort { (stat $b)[9] <=> (stat $a)[9] } glob($files) ) {

Это приведет к сортировке в обратном порядке временных меток, т. е. первый элемент будет самым новым.

Вероятно, вы не хотите перебирать весь список файлов, соответствующих глобусу, просто используйте самый последний:

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

my $glob_pattern = './Project/chris/company/Delta/force/*/total/data.list';

my @files = ( sort { (stat $b)[9] <=> (stat $a)[9] } glob($glob_pattern) );
my $file = $files[0];

printf "%s: %i\n", $file, count_lines($file);

sub count_lines {
...
...
...
}

Почему (stat $b)[9]и (stat $a)[9]? Потому что время модификации — это элемент номер 9 из списка из 13 элементов, возвращаемого функцией stat. Он обычно используется как:

my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
    $atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);

atime, mtime, или ctime— все числовые значения, секунды с начала эпохи (Полночь, 1 января 1970 г. по Гринвичу)-т.е. стандартное время Unix _значения t. Поскольку они числовые, их можно сортировать, сравнивать, добавлять, вычитать и т. д., как и любое другое числовое значение.

См. perldoc -f statдля получения более подробной информации о функции статистики.

Подробную информацию о функции sortсм. также в perldoc -f sort. В приведенном выше коде он использует блок кода для сортировки по значению, полученному из имени файла (, то есть их mtimes ), а не по самим именам файлов.

Кстати, помните, что массивы perl начинаются с 0, а не с 1. Таким образом, [9] — это десятый элемент, начиная с нуля. Кроме того, [6] является седьмым элементом, поэтому ваш (split('/',$_))[6], вероятно, должен был быть [5]вместо [6]. Сейчас в этом нет необходимости, так как приведенный выше код использует фактические временные метки файлов.

3
28.07.2021, 11:22

Сzsh:

wc -l <./Project/chris/company/Delta/force/run_<->_df/total/data.list([-1])

Дает количество строк¹ в data.listс наибольшим числом run_..._df. Пока

wc -l <./Project/chris/company/Delta/force/run_<->_df/total/data.list(-om[1])

Дает количество строк в последнем измененном data.list.

Или к Order nчислово по первой последовательности цифр, найденных в путях:

wc -l <./Project/chris/company/Delta/force/*/total/data.list(nOe['
  REPLY=${(MS)REPLY##<->}'][1])

¹ технически, из символов новой строки , что может дать вам число, отличное от подхода perl, если последняя «строка» не разделена.

0
28.07.2021, 11:22

Теги

Похожие вопросы