0

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

2 回答 2

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其写入数组,然后再循环遍历该数组。)

于 2013-01-09T20:58:01.570 回答
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 );
}
于 2013-01-09T21:02:56.497 回答