Perl:文件大于2GB时glob的奇怪行为

Perl:文件大于2GB时glob的奇怪行为,perl,aix,glob,Perl,Aix,Glob,我只是想得到一个给定通配符路径的文件名列表 my$path=“/foo/bar/*/*.txt”; my@file\u list=glob($path); foreach$current\u文件(@file\u列表){ 打印“\n-$current\u file”; } 大多数情况下,这是完美的,但是如果在/foo/bar/*子路径中的某个位置有一个大于2GB的文件,glob将返回一个空数组,而不会出现任何错误或警告 如果删除文件或添加如下字符/括号序列: my$path=“/foo/bar/

我只是想得到一个给定通配符路径的文件名列表

my$path=“/foo/bar/*/*.txt”;
my@file\u list=glob($path);
foreach$current\u文件(@file\u列表){
打印“\n-$current\u file”;
}
大多数情况下,这是完美的,但是如果在/foo/bar/*子路径中的某个位置有一个大于2GB的文件,glob将返回一个空数组,而不会出现任何错误或警告

如果删除文件或添加如下字符/括号序列:

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

my$path=“/foo/bar/*1/*.txt”;
然后地球仪又开始工作了

更新:

下面是一个示例(出于业务策略的考虑,我不得不屏蔽路径名):

正在删除>2GB文件(或使用“/foo/bar/[acf]/”istead of“/foo/bar/”)进行全局搜索)

有什么建议吗

我的工作对象是: Perl 5.8.8 AIX5.3
文件系统是一个本地jfs。

我以前从未使用过新的Glob函数,因此我无法评论它的优点/问题,但似乎有很多人在使用它时遇到了问题:请参阅=>了解一些问题和可能的解决方案

如果您不介意尝试其他东西: 以下是我在无数项目中使用过的经过尝试和测试的“老派”perl解决方案:

my $path = "/foo/bar/";
my @result_array = qx(find $path -iname '*.txt'); #run the system find command
如果出于任何原因,您不希望从脚本中运行系统命令,请查找内置的Find::Perl模块:


祝你好运

在没有正确答案的情况下,你将需要一个解决办法。我猜您在5.8.8的glob()实现中遇到了一些特定于平台的错误

我快速查看了CPAN上的源代码,但是我的C太生锈了,无法发现任何有用的东西

不过,该模块有很多更改,因此可能已经报告并修复了一个bug。您甚至不在5.8的最新版本中—有一个5.8.9提到了AIX兼容性和File::Glob的更新

如果您还没有安装,我会通过安装来测试这一点,然后可能会尝试更新File::Glob-看看它能做什么。您可能需要手动从以下位置下载文件:

如果这解决了问题,那么您可以将更新部署到所需的系统,或者必须重新实现所需的glob()位。这取决于你的模式有多复杂

如果它不能解决问题,那么至少你可以在代码中插入一些printf,看看它在做什么


希望有人会发布一个真实的答案,并在我单击“发布答案”后5分钟内将其冗余。

这是给出问题的实际的、完整的程序吗?我问这个问题的唯一原因是早期的
glob
可能会影响后来的
glob
返回的内容。问题出现在一个更复杂的代码上,但是这个问题被这个snipplet完美地复制了。你能在某处用实际数据文件显示尽可能小的可复制测试用例吗?我有一个关于这个问题的小更新。这个问题似乎与其中一个子路径中任何大于2GB的文件都密切相关。
perl-V:uselagefiles
(大写字母“V”)“new”的输出是什么?就像那些新型的移动无线电话或嘻哈音乐一样?
file::Find
是一个很好的建议;你应该带头去做。你的“久经考验的”解决方案并没有达到OP想要的效果。我发现否决票会让人失去动力。你声称我提出的解决方案“做不到同样的事情”?请解释一下你认为我的解决方案有什么作用——也许我误解了OP想要做什么
既然我们正在努力,您为什么不提供更好的解决方案呢?这会更有建设性,我们都会在这个过程中学习。@Flow,OP正在搜索第一级子目录,而您的答案似乎没有这样做。此外,使用模块几乎总是被认为比运行系统命令更好的做法,尤其是当它是Perl核心模块时。最重要的是,你所链接的搜索并不支持你关于glob有问题(除了不知道如何使用它的人)的建议。我没有否决你的帖子;很抱歉,如果我最初的评论令人沮丧,但我认为这需要改进,才能成为一个高质量的答案。我同意您关于模块与系统命令的看法-但在某些情况下,运行系统命令的效果更好或更快@Richard:hahaThanks了解有关Aix与Glob兼容性的详细信息。无论如何,我想我会尝试一些不同的内置函数。此脚本需要在大量(>200)的机器上分发,这些机器的环境稍有不同,并且有大量补丁/apar补丁/etc。
[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 #
my $path = "/foo/bar/";
my @result_array = qx(find $path -iname '*.txt'); #run the system find command