我只是想给出一个带有通配符的路径的文件名列表。
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。
答案 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
祝你好运