【问题标题】:Perl File::Find::Rule to exclude a single dirPerl File::Find::Rule 排除单个目录
【发布时间】:2014-09-23 05:44:20
【问题描述】:

我有如下所示的目录结构。

  1. 我只想在我的@project 中获取项目名称。 @project=('project1','project2');
  2. 我想排除OLD 目录及其在@project 中的子目录
  3. 我想在@project 的所有项目的子目录中获取最新文件。即,对于project1,最新文件在子目录2014,即foobar__2014_0916_248.txt

如何制定规则来实现这一目标?

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) 找到项目,2) 对于每个项目,找到最新的文件。

标签: perl file file-search


【解决方案1】:

按照 ikegami 的建议,只需分两步完成。

  1. 首先找到您的项目名称
  2. 二次查找最新文件

以下使用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

【讨论】:

  • 我无法在我的系统中安装 Path::Class::Rule 。从 cpan> install Path::Class::Rule 尝试。它给出了一个错误 Warning: Cannot install Path::Class::Rule;, don't know what it is. 。试过 curl -k -L http://cpanmin.us | perl - --sudo Path::Class 也抛出了一个错误
  • 不需要使用Path::Class,我只是喜欢那个模块分支,因为它可以轻松实现跨平台文件系统处理。您可以使用不同的方法轻松地遍历您的基本目录并使用File::Find::Rule 搜索项目树。只是可能需要更多代码。
  • 如果您想了解为什么无法安装这些模块,不妨提出一个新问题,因为您收到的错误消息没有意义。
  • 做了吗...发布了另一个问题..谢谢
  • @sravs448 我刚刚注意到,您似乎从 CPAN shell 运行了 install Path::Class::Rule;(带有分号)。删除分号,或者直接从命令行运行cpan install Path::Class::Rule
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
相关资源
最近更新 更多