[英]Perl File::Find::Rule to find latest file in directories
我正在嘗試在特定路徑( $output
)下獲取每個目錄中(每個項目)的最新文件列表,但不包括單個目錄OLD
use strict;
use warnings;
use Data::Dump;
use File::Find::Rule;
my $output = "/abc/def/ghi";
my @exclude_dirs = qw(OLD);
my $rule = File::Find::Rule->new; $rule->or($rule->new
->file()
->name(@exclude_dirs)
->prune
->discard,
$rule->new);
my @files = $rule->in("$output");
dd \@files;
我的目錄結構:
My Dir Structure:
/abc/def/ghi
├── 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
電流輸出:
/ ABC / DEF / GHI / PROJECT1 /
/ ABC / DEF / GHI / PROJECT1 / 2013
/abc/def/ghi/Project1/2013/file1_project1.txt
/ ABC / DEF / GHI / PROJECT1 / 20l4
/abc/def/ghi/Project1/2014/foobar_2014_0912_255.txt
/abc/def/ghi/Project1/2014/foobar_2014_0916_248.txt
/ ABC / DEF / GHI / Project2的
/ ABC / DEF / GHI / Project2的/ 2013
/abc/def/ghi/Project1/2013/file2_project1.txt
/ ABC / DEF / GHI / Project2的/ 2014
/abc/def/ghi/Project2/2014/foobarbaz_2014_0912_255.txt
/abc/def/ghi/Project2/2014/foobarbaz_2014_0912_248.txt
所需輸出:
/abc/def/ghi/Project1/2014/foobar_2014_0912_255.txt
/abc/def/ghi/Project2/2014/foobarbaz_2014_0912_248.txt
File::Find::Rule
的以下用法將為您提供完整的文件列表。
您可以構建數組的哈希值以保存結果,然后過濾出每個項目的最新文件:
use strict;
use warnings;
use Data::Dump;
use File::Find::Rule;
my $basedir = "testing";
my @exclude_dirs = qw(OLD);
my $rule = File::Find::Rule->new;
$rule->or( $rule->new->directory()->name(@exclude_dirs)->prune->discard, $rule->new )->file;
my @files = $rule->in($basedir);
dd @files;
輸出:
(
"testing/project1/2013/file1_project1.txt",
"testing/project1/2014/foobar__2014_0912_255.txt",
"testing/project1/2014/foobar__2014_0916_248.txt",
"testing/project2/2013/file1_project2.txt",
"testing/project2/2014/foobarbaz__2014_0912_255.txt",
"testing/project2/2014/foobarbaz__2014_0916_248.txt",
)
為了完成過濾,以下附錄使用Path::class
:
...; # Continued from previous code.
use Path::Class;
my %projects;
for (@files) {
my $file = file($_);
my $project = $file->parent->parent;
$projects{$project} = $file if ! $projects{$project} || $file->stat->mtime > $projects{$project}->stat->mtime;
}
while (my ($project, $file) = each %projects) {
print "$project - $file\n";
}
輸出:
testing/project2 - testing/project2/2014/foobarbaz__2014_0916_248.txt
testing/project1 - testing/project1/2014/foobar__2014_0916_248.txt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.