使用Perl,将一个文件列表推入一个数组,除了一些基于文件名的选择文件

时间:2013-01-09 20:37:22

标签: regex perl archive-tar

我正在通过网页上传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);

2 个答案:

答案 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 );
}