0

Webページからtarballをアップロードし、それを/ tmp /にドロップしてから、このスクリプト(crontabを介して呼び出されます)に次のように要求します。

1.)それを抽出する

2.)ディレクトリ内のすべてのファイル(ファイルのみおよび再帰的)のリストを作成します

3.)各ファイルで文字列を検索し、そのファイル名と一致する文字列の行をファイルに出力します。

(抽出されたtarball)ディレクトリにファイルのリストを作成したい部分まですべてが機能しています。「!」を入れない私のコードの6行目の正規表現の前(.bak、.conf、.cfgであるファイルのみに一致)では、@ filelistに12個のファイルしかありません(予想どおり、行のコードによって印刷されます) 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 行目でディレクトリを追加し、@filelist13 行目でそのディレクトリとそのサブディレクトリ内のすべてのファイルを出力します。

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 に答える