我正在通过网页上传tarball,将其放入/ tmp /然后将此脚本(将通过crontab调用)询问:
1。)提取它
2。)在目录
中构建所有文件(仅文件和递归)的列表3.。)搜索每个文件中的字符串,并将该文件名和带有匹配字符串的行打印到文件中。
我想在(提取的tarball)目录中构建文件列表的部分正在进行中。如果我不放一个“!”在我的代码中第6行的正则表达式前面(仅匹配.bak,.conf,.cfg文件),然后我只在@filelist中获取了十几个文件(正如我所料,由代码在线打印) 13)。
但是,如果我把“!”在第6行的正则表达式前面(用于匹配所有但这些文件),第13行将打印所有文件名,包括带.bak,.conf和.cfg扩展名的文件。
如何在(提取的tarball)目录中获取文件名集合,除了那些我不关心的文件名?
这是我的代码,大致(剥离,未经测试。)我是一个perl newb,所以我为我在这里所拥有的丑陋而道歉但它就是它。
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);
答案 0 :(得分:1)
您在第7行向@filelist
添加目录,然后在第13行打印该目录及其子目录中的所有文件。
第6行应该是:
if ( -f $File::Find::name && $File::Find::name !~ /\.(?:bak|conf|cfg)\z/i ) {
第13行应该是:
searcher($_) for @filelist;
searcher
应该是:
sub searcher {
my ($file) = @_;
print "Searching $file\n";
}
避免全球变量,整体看起来像:
sub loadFiles {
my $dir=shift;
my @filelist;
my $wanted = sub {
return if $File::Find::name =~ /\.(?:bak|conf|cfg)\z/i;
return if !-f $File::Find::name;
push @filelist, $File::Find::name;
};
find($wanted, $dir);
return @filelist;
}
sub searcher {
my $file=shift;
print "Searching $file\n";
}
searcher($_) for loadFiles($dir_loc);
(从技术上讲,您可以直接执行searcher($File::Find::name);
而不是push
将其添加到数组中,然后循环遍历数组。)
答案 1 :(得分:0)
my $tarball = '/tmp/mytarball.tar.gz';
my $ae = Archive::Extract->new( archive=>$tarball ) || die ("$!");
my @files;
$ae->extract( to=>$UPLOAD_DIR ) || die ("$ae->error");
for my $file (@{$ae->files}) {
push @files, $file if $file =~ /(\.bak|\.conf|\.cfg)$/i );
}