2011-02-18 53 views
1

我在需要处理的目录中有几千个文本文件。 类似命名的,但也有一些变化:perl - 处理许多类似命名的文本文件的最佳方式

/home/dir/abc123.name.efg-joe_p000.20110124.csv 
/home/dir/abc456.name.efg-jon_p000.20110124.csv 
/home/dir/abc789.name.efg-bob_p000.20110124.csv 

我有一个Perl脚本,可以一次处理一个文件,而一个问题:

./script.pl /home/dir/abc123.name.efg-joe_p000.20110124.csv 

什么是传递的最佳方式和过程中的许多这些文件,一次?我在看ARGV吗? 我应该列出文件在一个单独的文件,然后用它作为输入?

回答

4

如果 “最佳” 你的意思是 “无代码更改,”并且正如你的路径名所示,在类似NIX的系统上,试试这个:

$ find /home/dir -type f -name \*.csv -exec ./script.pl {} \; 

如果script.pl可以处理多个文件名参数,你可能会在一段时间并行,比如说,10:

$ find /home/dir -type f -name \*.csv | xargs -n 10 ./script.pl 
4

您可以传递一个文件模式作为参数(glob格式),然后将其传递给glob调用来列出文件;然后逐个循环处理它们。

./script.pl -file_pattern "/home/dir/abc123.name.efg-joe_p000.*.csv" 

在脚本

my @files = glob($file_pattern); 
+0

FYI:差别看起来就像是在用户名(如乔,乔,BOB),而不是日期 – vol7ron 2011-02-18 21:56:05

+0

不是简单的做foreach我的$文件(@ARGV){等等; } – 2011-02-18 22:35:43

+0

如何将多个文件名传递给@ARGV? – jdamae 2011-02-18 22:38:37

2

您可以使用readdir在一次读取文件名之一:

opendir my $dh, $some_dir or die "can't opendir $some_dir: $!"; 

while (defined(my $file = readdir($dh))) { 
    next if $file =~ /^\./; 
    print $file; 
} 
相关问题