1

我面临两个问题。

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 、 denied_as )我如何使用 file::find 来实现这一点

我想我有点困惑实际上下面是我需要的输出

从上面的代码 $file::find::name 显示文件路径,如果此文件路径包含过时或退役,则不应显示该输出。

例如,我得到了类似的路径

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

不应显示上述第一个路径,因为它的单词已过时。

我想现在我很清楚了。提前致谢

4

3 回答 3

1

要拒绝不需要的文件,您应该使用正则表达式检查文件的名称,并在必要时return从子例程中检查。print_file

要忽略包含obsoleteor的目录,retired您应该检查节点是否是名称包含这些单词中的任何一个的目录。如果是这样,那么设置$File::Find::prune为真值将防止File::Find递归进入它。

请注意,如果调用不起作用,我使用use autodie了 which 将隐式引发异常,并允许按名称访问调用结果的字段。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 回答