Может делать все это в Perl
perl -MPOSIX=strftime -wE'$d = shift || ".";
say strftime("%Y-%m-%d", localtime((stat $_)[9])), "; $_"
for sort { (stat $b)[9] <=> (stat $a)[9] } glob "$d/*log*"
' dir-name
, где вы отправляете dir-name
в одну строку (или она работает с .
, текущим каталогом).
Обратите внимание, я не вижу необходимости в find
, поскольку вы получаете список (журналов) файлов из каталога.
Это можно оптимизировать, чтобы не запускать stat
неоднократно, но я сомневаюсь, что это имеет значение в ожидаемом использовании.Я бы порекомендовал поместить это в хороший маленький скрипт, хотя.
Тем не менее, stat
недешево, и если это регулярно ловит длинные списки файлов, используйте
perl -MPOSIX=strftime -wE'$d = shift || ".";
say strftime("%Y-%m-%d", localtime($_->[1])), "; $_->[0]"
for
sort { $b->[1] <=> $a->[1] }
map { [$_, (stat $_)[9]] } glob "$d/*log*"
' dir-name
, гдеЯ разделил оператор на еще больше строк, чтобы подчеркнуть это изменение.
Список входных файлов из glob
используется для создания первого списка, используя map
, с arrayref для каждого имени файла:Назовите и метку времени этого файла.Тогда парные сравнения в sort
не должны проходить stat
каждый раз;они используют временные метки, предварительно рассчитанные один раз.Это называется преобразованием Шварца .Кроме того, sprintf
также не нужно снова запускать stat
.
Обратите внимание, что оптимизация сопряжена с накладными расходами, поэтому используйте ее только тогда, когда она действительно требуется.См., Например, этот пост (последний раздел) для обсуждения и ссылок.