11

我只是想获取给定带有通配符的路径的文件名列表。

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 #

删除 >2GB 文件(或使用“/foo/bar/[acf] / ”而不是“/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。

4

2 回答 2

4

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

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

不过,该模块已经发生了很多变化,因此很可能已经报告并修复了一个错误。您甚至还没有使用 5.8 的最后一个版本——那里有一个 5.8.9,其中提到了对 AIX 兼容性和 File::Glob 的更新。

如果你还没有安装local::lib,我会测试这个,然后可能是cpanm并尝试更新 File::Glob - 看看它做了什么。您可能需要从此处手动下载文件

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

如果它不能解决问题,那么至少您可以将一些 printf 粘贴到代码中并查看它在做什么。

希望有人会在我单击“发布您的答案”后大约 5 分钟发布一个真正的答案并使其变得多余。

于 2012-11-16T17:12:29.887 回答
-3

我以前从未使用过新的 Glob 函数,所以我无法评论好处/问题,但似乎很多人在使用它时遇到了问题:请参阅 => https://stackoverflow.com/search?q=perl +glob&submit=搜索一些问题和可能的解决方案。

如果您不介意尝试其他方法:这是我在无数项目中使用过的久经考验的“老派”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 /文件/查找.pm

祝你好运

于 2012-11-16T14:00:11.590 回答