我正在通过网页上传 tarball,将其放入 /tmp/ 然后询问此脚本(将通过 crontab 调用):
1.)提取它
2.)构建目录中所有文件的列表(仅文件和递归)
3.)在每个文件中搜索一个字符串并将该文件名和匹配字符串的行打印到文件中。
一切都在我想在(提取的 tarball)目录中构建文件列表的部分工作。如果我不放“!” 在我的代码中第 6 行的正则表达式前面(仅匹配 .bak、.conf、.cfg 的文件),然后我在 @filelist 中只得到十几个文件(正如我所料,由在线代码打印13)。
但是,如果我放一个“!” 在第 6 行的正则表达式前面(旨在匹配除这些文件之外的所有内容),第 13 行将打印所有文件名,包括具有 .bak、.conf 和 .cfg 扩展名的文件。
除了我不关心的那些之外,如何在(提取的 tarball)目录中获取文件名的集合?
这是我的代码,大致(精简,未经测试)。我是一个 perl 新手,所以我为我在这里的丑陋道歉,但它就是这样。
1 sub loadFiles {
2 my $dir=shift;
3 find(\&recurDir,"$dir");
4 }
5 sub recurDir {
6 if ( $File::Find::name =~ /(\.bak|\.conf|\.cfg)$/i ) {
7 push @filelist, $File::Find::name;
8 }
9 print "$File::Find::name\n";
10 }
11 sub searcher {
12 my $file=$_;
13 print "Searching $file\n";
14 }
15 my $tarball = '/tmp/mytarball.tar.gz';
16 my $ae = Archive::Extract->new( archive=>$tarball ) || die ("$!");
17 $ae->extract( to=>$UPLOAD_DIR ) || die ("$ae->error");
18 my $dir_loc = File::Spec->catfile( $UPLOAD_DIR, $ae->files->[0]);
19 loadFiles("$dir_loc");
20 find(\&searcher, @filelist);