Perl正则表达式遍历所有目录并获取特定文件

时间:2016-10-07 02:01:04

标签: perl unix

我想将unix正则表达式转换为Perl语言,以获得与某些条件相关的特定文件。

假设现在我在目录/nfs/cs/test_case/y2016中有Perl脚本调用totalResult.pl,这个目录也包含很多目录,例如testWeek1,testWeek2,testWeek3 ......等。每个目录都包含子目录,如testCase1,testCase2,testCase3等。每个testCase目录包含一个文件调用.test_result,包含记录结果成功或失败。

所以我可以使用unix命令获取文件信息,例如:

wc /nfs/cs/test_case/y2016/testWeek1/testCase1/.test_result

如果想要获取每个失败的目录和子目录的test_results,我可以从unix中的当前路径/nfs/cs/test_case/y2016执行此操作,如:

grep -ri "fail" */*/.test_result

它会给我输出:

/nfs/cs/test_case/y2016/testWeek1/testCase1/.test_result:fail
/nfs/cs/test_case/y2016/testWeek3/testCase45/.test_result:fail
/nfs/cs/test_case/y2016/testWeek4/testCase12/.test_result:fail
.
.
...etc

如何在编写Perl脚本时实现它只需运行命令perl testCase.pl然后可以得到相同的输出?我是unix和Perl的新手,任何人都可以提供帮助吗?

2 个答案:

答案 0 :(得分:3)

# Collect names of all test files
my @TestFiles = glob('/nfs/cs/test_case/y2016/*/*/.test_result');
# Check test files for "fail"
foreach my $TestFile ( @TestFiles ) {
  open(my $T,'<',$TestFile) or die "Can't open < $TestFile: $!";
  while(<$T>){
    if( /fail/ ) {
       chomp;
       print $TestFile,":",$_,"\n";
    }
  }
  close($T);
}

答案 1 :(得分:0)

您也可以使用back tick(`)运算符在Perl中执行相同的linux命令。

@ result =`grep -ri“fail”* / * /.test_result`;

print @result;