Perl File :: Find ::规则排除单个目录

时间:2014-09-17 16:27:38

标签: perl file file-search

我有以下显示的目录结构。

  1. 我想在@project中找到项目名称。 @project=('project1','project2');
  2. 我想在OLD
  3. 中排除@project目录及其子目录
  4. 我想在@project中的所有项目的子目录中获取最新文件。即,对于project1,最新文件位于子目录2014中,即foobar__2014_0916_248.txt
  5. 如何构建规则以实现此目标?

    use strict;
    use File::Find::Rule;
    use Data::Dump;
    my $output       = "/abc/def/ghi";
    my @exclude_dirs = qw(OLD);
    my @projects     = File::Find::Rule->directory->in("$output");
    dd \@projects;
    

    我的目标结构:

    .
    ├── project1
    │   ├── 2013
    |        ├── file1_project1.txt
    │   └── 2014
    |         ├── foobar__2014_0912_255.txt
    |         ├── foobar__2014_0916_248.txt
    ├── project2
    │   ├── 2013
    |        ├── file1_project2.txt
    │   └── 2014
    |         ├── foobarbaz__2014_0912_255.txt
    |         ├── foobarbaz__2014_0916_248.txt
    └── OLD
        └── foo.txt
    

1 个答案:

答案 0 :(得分:3)

正如池上建议,只需分两步完成。

  1. 首先找到您的项目名称
  2. 第二次找到最新的文件
  3. 以下使用Path::ClassPath::Class::Rule

    执行此操作
    use strict;
    use warnings;
    use autodie;
    
    use Path::Class;
    use Path::Class::Rule;
    
    my $testdir = dir('testing');
    
    for my $project ( $testdir->children ) {
        next if !$project->is_dir() || $project->basename eq 'OLD';
    
        my $newest;
    
        my $next = Path::Class::Rule->new->file->iter($project);
        while ( my $file = $next->() ) {
            $newest = $file if !$newest || $file->stat->mtime > $newest->stat->mtime;
        }
    
        print "$project - $newest\n";
    }
    

    输出:

    testing/project1 - testing/project1/2014/foobar__2014_0916_248.txt
    testing/project2 - testing/project2/2014/foobarbaz__2014_0916_248.txt