1

私は 2 つの問題に直面しています。

1) 特定のキーワードでディレクトリを検索していますが、ディレクトリには .java .sql .ksh .pl .jar などの多くの拡張子を持つファイルが含まれています。今私の問題は、 .jar または .doc または .docx を持つファイルを検索したくないことです。現在、私のコードは以下のようになっています

use strict;
use warnings;
use File::find;

my $dir = "C:\DURAB\";
my $out = "output.txt";
open my $out, ">", "output.txt";
find(\&printFile,$dir);                                       

sub printFile {
   my $element = $_;

   if(-f $element && $element =~ /\.*$/){ 

      open my $in, "<", $element or die $!;
      while(<$in>) {
         if (/\Q$searchString\E/) {
       my $last_update_time = (stat($element))[9];
            my $timestamp  = localtime($last_update_time);
            print $out "$File::Find::name". "     $timestamp". "     $searchString\n";
            last;
           }
         }

      }
    }

これで、すべてのファイルを検索しています。.jar、.exe、.doc のような拡張子を検索する必要がないように、検索を制限したいと考えています。

2)ディレクトリを検索しているときに、多くのサブディレクトリがあります。古い名前または廃止された名前のディレクトリを検索したくありません (たとえば、 obsolete_dr 、retiret_as ) file::find を使用してこれを達成するにはどうすればよいですか

私は少し混乱していると思いますが、実際には以下が必要な出力です

上記のコードから、 $file::find::name はファイル パスを表示します。このファイル パスに廃止または廃止が含まれている場合、その出力は表示されません。

たとえば、次のようなパスを取得しました

c:\DURAB\ASD\OBSOLETE_EC23\sirgu.sql and c:\DURAB\AS\drive.ksh

上記の最初のパスからは、obsolete という単語が含まれているため表示されません。

私は今、私ははっきりしていると思います。前もって感謝します

4

3 に答える 3

1

不要なファイルを拒否するには、正規表現を使用して、必要に応じてサブルーチンreturnからファイルの名前を確認する必要があります。print_file

obsoleteorを含むディレクトリを無視するretiredには、ノードがこれらの単語のいずれかを名前に含むディレクトリであるかどうかを確認する必要があります。$File::Find::pruneその場合、true 値に設定するとFile::Find、再帰が防止されます。

呼び出しが機能しないuse autodie場合に暗黙的に例外を発生させ、 への呼び出しの結果のフィールドへの名前によるアクセスを許可するを使用したことに注意してください。openFile::statstat

ゼロ個以上の末尾のドットが必要なため、任意の文字列に一致する正規表現の意味がわかり/\.*$/ませんが、このコードでは、ドットで終わるファイル名も除外されます。

use strict;
use warnings;

use File::Find;
use File::stat;
use autodie;

my $dir = 'C:\DURAB';
my $search_string = 'ABCDEF';

my $out = 'output.txt';
open my $outfh, '>', $out;

find(\&print_file, $dir);

sub print_file {

  if ( -d and /obsolete|retired/i ) {
    $File::Find::prune = 1;
    return;
  }

  return unless -f and not /\.(exe|doc|docx|exe|)$/;

  my $element = $_;

  open my $in, '<', $element;

  while (<$in>) {
    if ( /\Q$search_string\E/ ) {
      my $last_update_time = stat($element)->mtime;
      my $timestamp = localtime $last_update_time;
      printf $outfh "%s     %s     %s\n",
          $File::Find::name,
          $timestamp,
          $search_string;
      last;
    }
  }
}
于 2013-02-06T15:30:59.613 に答える
1
return if /\.(?:docx?|jar)\z/;

if (/obsolete|retired/) {
   $File::Find::prune = 1;
   return;
}
于 2013-02-06T15:15:01.790 に答える
-1

この行を変更

 if(-f $element && $element =~ /\.*$/){ 

これに

 if( (-f $element && $element !~ /\.(jar|docx?)$/i) || ( $File::Find::dir !~ /(obsolete|retired)/i) ){ 

良いガイド: http://www.perlmonks.org/?node_id=217166

よろしく、

于 2013-02-06T15:17:22.200 に答える