Как я могу перечислить файлы с помощью find и Perl? - PullRequest
0 голосов
/ 11 февраля 2019

Я работаю на машине на базе HP-UX, и мне нужно перечислить имена журналов, содержащихся в папке, по дате и отделенных от имени знаком ";"и результат, отсортированный по дате в порядке убывания, сохраняется в текстовом формате, поэтому содержимое текстового файла будет выглядеть следующим образом:

2019-02-02;/home/user/Documents/imthelog03.log
2019-02-01;/home/user/Documents/imthelog02.log
2019-01-29;/home/user/Documents/imthelog01.log

Я пробовал это:

find /home/user/Documents/*.log* exec perl -MPOSIX -e 'print POSIX::strftime "%Y%m%d\n", localtime((stat $ARGV[0])[9])'

, ноЯ не могу получить то, что мне нужно, я не могу использовать stats Я использую for для чтения построчно, так как я могу получить дату и path/filename, разделенные ; вtxt, отсортировано по дате по убыванию с использованием bash и в конечном итоге perl, спасибо!

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Может делать все это в 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.

Обратите внимание, что оптимизация сопряжена с накладными расходами, поэтому используйте ее только тогда, когда она действительно требуется.См., Например, этот пост (последний раздел) для обсуждения и ссылок.

0 голосов
/ 12 февраля 2019
find /home/user/Documents/*.log* -type f -exec perl -MPOSIX -le 'print strftime("%Y%m%d",localtime((stat $ARGV[0])[9])),";$ARGV[0]"' {} \; | sort -k1,1
...