如何在Perl脚本中递归查找文件/文件夹?

时间:2011-02-23 10:32:16

标签: perl module find

我有一个perl脚本,我已经写过,以递归方式搜索我的Windows文件夹中的文件。我输入搜索文本作为perl脚本运行时参数,以查找具有此文本名称的文件。 perl脚本如下:

use Cwd;

$file1 = @ARGV[0];    

#@res1 = glob "*test*";
#@res1 = glob "$file1*";
@res1 = map { Cwd::abs_path($_) } glob "$file1*";
foreach (@res1)
{
    print "$_\n";
}

但这并不是递归地搜索所有子目录。我知道glob递归不匹配 所以尝试使用模块File::Find和函数find(\&wanted, @directories);

但我收到一条错误,说find()未定义。从我从帮助中读到的内容,我认为默认情况下在Perl安装中定义了find()函数,其中包含一些查找文件夹/文件的基本代码。这不正确吗?

问题是,在上面的perl脚本中,我如何递归搜索文件/文件夹?

第二个问题,我发现perldoc <module> help没有关于在该模块中使用某个函数的示例,这将使其清楚。

您是否可以指出一些好的帮助/文档/书籍,以便使用来自不同perl模块的各种perl函数以及使用这些模块函数的明确示例。

5 个答案:

答案 0 :(得分:15)

另一个优秀的模块是File::Find::Rule,它隐藏了File::Find的一些复杂性,同时暴露了相同的丰富功能。

use File::Find::Rule;
use Cwd;

my $cwd = getcwd();
my $filelist;

sub buildFileIndex {
    open ($filelist, ">", "filelist.txt") || die $!;

    # File find rule
    my $excludeDirs = File::Find::Rule->directory
                              ->name('demo', 'test', 'sample', '3rdParty') # Provide specific list of directories to *not* scan
                              ->prune          # don't go into it
                              ->discard;       # don't report it

    my $includeFiles = File::Find::Rule->file
                             ->name('*.txt', '*.csv'); # search by file extensions

    my @files = File::Find::Rule->or( $excludeDirs, $includeFiles )
                                ->in($cwd);

    print $filelist map { "$_\n" } @files;
    return \$filelist;
}

答案 1 :(得分:7)

这两页都是您需要学习的内容:

答案 2 :(得分:4)

另一种方法是使用find2perl为您创建脚本的开头。它可以变成像

这样的查找命令
find . -type f -name "*test*" -print

到等效的perl脚本。你只需将find2perl放入find而不是find。它使用File :: Find引擎盖,但让你快速前进。

答案 3 :(得分:4)

如果您不介意使用cpan模块,Path::Class可以为您完成工作:

use Path::Class;

my @files;
dir('.')->recurse(callback => sub {
    my $file = shift;
    if($file =~ /some text/) {
        push @files, $file->absolute->stringify;
    }
});

for my $file (@files) {
    # ...
}

答案 4 :(得分:0)

fileReader

在Linux(Fedora)上列出驱动程序模块的示例:

<div className="previewsection-el">
  <ul>
    {acceptedFiles.map((file, index) => {
      var filetype = file.path.split(".")[1];
      switch (filetype) {
        case "jpg":
        case "png":
        case "jpeg":
          var readImg = "";
          let reader = new FileReader();
          reader.onload = next => {
            readImg = reader.result;
          };
          reader.readAsDataURL(file);
          //cannot return here.
          return (
            <li>
              <img src={readImg} />
            </li>
          );
        case "rar":
        case "zip":
          return (
            <li>
              <i className="file-archive" />
            </li>
          );
        default:
          return (
            <li>
              <i className="material-icons">insert_drive_file</i>
            </li>
          );
      }
    })}
  </ul>
</div>;