Я подозреваю, что задержка, которую вы видите, связана с продолжительностью времени, необходимого для получения всех результатов.Конечно, если вы перенаправите вашу команду find
в less
, вы сразу получите результаты, но если вы перенаправите ее в tail
, вы можете увидеть задержку, похожую на ту, что вы видите в вашем скрипте Perl.
В обеих ваших альтернативных реализациях вы создаете массив со списком всех совпадающих файлов - ваш код не будет продолжаться до тех пор, пока не будет завершен процесс сопоставления файлов.
В качестве альтернативы вы можете использовать итераторный подход, подобный следующему:
my $rule = File::Find::Rule->permissions(isExecutable => 1, user => $uid)
->extras({ follow => 1, follow_skip => 2 })
->directory
->maxdepth(1)
->start($dir);
while( defined ( my $path = $rule->match ) ) {
...
}
Для полноты вы можете достичь аналогичного результата с помощью команды find.Вместо использования обратных кавычек вы можете явно использовать канал и читать результаты по одному:
open my $pipe, 'find $dir -maxdepth 1 -type d -user $username -perm -100|' or die "Can't run find: $!";
while(my $path = <$pipe>) {
...
}
Обратите внимание, что в обоих этих примерах ваш код может начать обработку результатов, как только будет найдено первое совпадение.Однако общее время, необходимое для обработки последнего результата, не должно сильно отличаться от исходного кода.