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

时间:2012-11-16 09:05:34

标签: perl aix glob

我只是想给出一个带有通配符的路径的文件名列表。

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

大多数情况下这很有效,但是如果有一个大于2GB的文件,在某个/ foo / bar / *子路径中的某个地方,则glob返回一个空数组而没有任何错误或警告。

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

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

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

然后glob再次运作。

更新:

以下是一个示例(对于业务策略而言,我必须屏蔽路径名):

[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 #

删除&gt; 2GB文件(或使用“/ foo / bar / [acf] / ”进行通配,而不是“/ foo / bar / / ”)< / p>

[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 艾克斯5.3 文件系统是本地jfs。

2 个答案:

答案 0 :(得分:4)

在没有正确答案的情况下,你会想要一个解决方案。我猜你在5.8.8

的glob()实现中遇到了一些特定于平台的错误

我快速浏览了CPAN上的来源,但我的C太生疏了,没有发现任何有用的东西。

虽然该模块已经有很多变化,但是很可能已经报告并修复了一个错误。你甚至没有发布5.8的最后一个版本 - 那里有一个5.8.9,它提到了AIX兼容性和File :: Glob的更新。

我会通过安装local::lib来测试这个,如果你还没有,那么可能cpanm并尝试更新File :: Glob - 看看它的作用。您可能需要手动从例如下载文件。 here

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

如果它没有解决问题,那么至少你可以将一些printf粘贴到代码中,看看它在做什么。

希望有人会在我点击“发布你的答案”后大约5分钟发布一个真正的答案并将其变为多余。

答案 1 :(得分:-3)

我之前从未使用过新的Glob功能,因此我无法评论其中的好处/问题,但似乎有很多人在使用它时遇到了问题:see =&gt; https://stackoverflow.com/search?q=perl+glob&submit=search了解一些问题和可能的解决方案。

如果你不介意尝试别的东西: 这是我在无数项目中使用的经过试验和测试的“旧学校”perl解决方案:

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

如果您 - 无论出于何种原因而不想在脚本中运行系统命令,请改为查找内置的Find :: Perl模块:http://search.cpan.org/~dom/perl-5.12.5/lib/File/Find.pm

祝你好运