-4

-f オプションを介してユーザー入力を取得しています。ユーザーが入力したものは何でも、それに応じてファイルが再帰的に検索されます。

私の問題は次のとおりです。ユーザーが「tmp*」と入力すると、「abctmp」、「xyztmp」なども検索されます。私がやりたいのは、tmp で始まるファイルのみが来ることです。つまり、ユーザーが入力したファイルはすべて配列にプッシュする必要があります。

現在私はこれを行っていますが、上品で短い方法があると確信しています。

#! /perl/bin/perl
use strict;
use warnings;
use File::Find;
use getopt::Long;

my $filename="tmp*.txt";
find( { wanted     => \&wanted,
        preprocess => \&dir_search,
}, '.');

sub wanted{
    my $regex;
    my $myop;
    my @mylist;
    my $firstchar= substr($filename, 0,1); # I am checking first character. 
                                           # Whether it's ".*tmp" or just "tmp*"

    if($filename=~ m/[^a-zA-Z0-9_]/g){     #If contain wildcard
        if($firstchar eq "."){             # first character "."
            my $myop  = substr($filename, 1,1);
            my $frag  = substr($filename,2);
            $filename = $frag;
            $regex    = '\b(\w' . ${myop}. ${filename}. '\w*)\b'; 
            # Has to find whatever comes before 'tmp', too
        } else {
            $regex    = '\b(' . ${myop}. ${filename}. '\w*)\b'; 
            # Like, "tmp+.txt" Only search for patterns starting with tmp
        }
        if($_ =~ /$regex/) {
            push(@mylist, $_);
        }
    } else {
    if($_ eq $filename) { #If no wildcard, match the exact name only.
        push(@mylist, $_);
    }
}

}

sub dir_search {
    my (@entries) = @_;
    if ($File::Find::dir eq './a') {
        @entries = grep { ((-d && $_ eq 'g') || 
                      ((-d && $_ eq 'h')  || 
                     (!(-d && $_ eq 'x')))) } @entries; 
    # Want from 'g' and 'h' folders only, not from 'x' folder
    }
    return @entries;
}

もう1つは、「.txt」ファイルのみを検索したいということです。その条件をどこに置くべきですか?

4

1 に答える 1

1
#!/perl/bin/perl

sub rec_dir {
    ($dir,$tmpfile_ref) = @_;
    opendir(CURRENT, $dir);
    @files = readdir(CURRENT);
    closedir(CURRENT);

    foreach $file (@files) {
        if( $file eq ".." || $file eq "." ) { next; }
        if( -d $dir."/".$file ) { rec_dir($dir."/".$file,$tmpfile_ref); }
        elsif( $file =~ /^tmp/ && $file =~ /\.txf$/ ) { push(@{$tmpfile_ref},$dir."/".$file); }
    }
 }

 @matching_files = ();
 $start_dir = ".";
 rec_dir($start_dir,\@matching_files);
 foreach $file (@matching_files) { print($file."\n"); }

私はそれをテストしませんでした。誤植がなければうまくいくと思います。

于 2013-07-29T14:35:24.220 に答える