Perl: странное поведение glob с файлами размером более 2 ГБ

Я просто пытаюсь получить список имен файлов, заданных с помощью шаблона.

my $path = "/foo/bar/*/*.txt";
my @file_list = glob($path);
foreach $current_file (@file_list) {
   print "\n- $current_file";
}

В основном это работает отлично, но если есть файл размером более 2 ГБ, где-то в одном из подпунктов /foo/bar/ *, glob возвращает пустой массив без каких-либо ошибок или предупреждений.

Если я удалю файл файла или добавлю последовательность символов/скобок, как это:

my $path = "/foo/bar/*[0-9]/*.txt";

или

my $path = "/foo/bar/*1/*.txt";

тогда glob снова работает.

UPDATE:

Вот пример (для бизнес-политики мне пришлось замаскировать путь):

[root]/foo/bar # ls -lrt
drwxr-xr-x    2 root     system         256 Oct 11 2006  lost+found
drwxr-xr-x    2 root     system         256 Dec 27 2007  abc***
drwxr-xr-x    2 root     system         256 Nov 12 15:32 cde***
-rw-r--r--    1 root     system  2734193149 Nov 15 05:07 archive1.tar.gz
-rw-r--r--    1 root     system     6913743 Nov 16 05:05 archive2.tar.gz
drwxr-xr-x    2 root     system         256 Nov 16 10:00 fgh***
[root]/foo/bar # /home/user/test.pl
[root]/foo/bar #

Удаление файлa > 2 ГБ (или подглаживание с помощью /foo/bar/ [acf]/ "istead of" /foo/bar// ")

[root]/foo/bar # ls -lrt
drwxr-xr-x    2 root     system         256 Oct 11 2006  lost+found
drwxr-xr-x    2 root     system         256 Dec 27 2007  abc***
drwxr-xr-x    2 root     system         256 Nov 12 15:32 cde***
-rw-r--r--    1 root     system     6913743 Nov 16 05:05 archive2.tar.gz
drwxr-xr-x    2 root     system         256 Nov 16 10:00 fgh***

[root]/foo/bar # /home/user/test.pl
- /foo/bar/abc***/heapdump.phd.gz
- /foo/bar/cde***/javacore.txt.gz
- /foo/bar/fgh***/stuff.txt
[root]/foo/bar #

Любое предложение?

Я работаю с: Perl 5.8.8 Aix 5.3 Файловая система является локальным jfs.

Ответ 1

В отсутствие правильного ответа вам понадобится обход. Я предполагаю, что вы столкнулись с определенной ошибкой для платформы в реализации glob() версии 5.8.8

Я быстро посмотрел на источник в CPAN, но мой C слишком ржавый, чтобы найти что-нибудь полезное.

В этом модуле было внесено множество изменений, так что ошибка может быть сообщена и исправлена. Вы даже не в последней версии 5.8 - там есть 5.8.9, где упоминаются обновления совместимости AIX и File:: Glob.

Я бы проверил это, установив local:: lib, если вы еще этого не сделали, а затем, возможно, cpanm и попробуйте обновить File:: Glob - посмотрите, что это делает. Возможно, вам придется загружать файлы вручную, например. здесь

Если это решает проблему, вы можете либо развернуть обновления для требуемых систем, либо вам придется повторно реализовать биты glob(), которые вы хотите. Что будет зависеть от того, насколько сложны ваши шаблоны.

Если это не решит проблему, то, по крайней мере, вы сможете вставить некоторый printf в код и посмотреть, что он делает.

Надеюсь, кто-то опубликует реальный ответ и сделает это лишним примерно через 5 минут после того, как я нажму "Опубликовать свой ответ".

Ответ 2

Я никогда раньше не использовал новую функцию Glob, поэтому я не могу комментировать преимущества/проблемы, но, похоже, у многих людей были проблемы с ее использованием: see = > https://stackoverflow.com/search?q=perl+glob&submit=search для некоторых вопросов и возможных решений.

ЕСЛИ вы не возражаете попробовать что-то еще: Вот мое испытанное решение "старой школы", которое я использовал в бесчисленных проектах:

my $path = "/foo/bar/";
my @result_array = qx(find $path -iname '*.txt'); #run the system find command

Если вы по какой-либо причине предпочитаете не запускать системную команду из вашего script, а затем искать встроенный модуль Find:: Perl: http://search.cpan.org/~dom/perl-5.12.5/lib/File/Find.pm

удача