2015-09-05 28 views
0

我想获得所有子目录和文件里面'dir1,dir2,dir3,dir4,dir5'如下所示,并将其推送到另一个Dir。如果我使用这个代码,我会得到一切。不过,我需要处理更多像这样的目录。有没有简单的方法来使用简单的代码来处理所有这些'dir1到... dirx',而不是在下面分别指定每个目录。由于提前如何使用简单的代码perl处理和推送多个目录

use File::Find::Rule; 
my @pushdir; 
my @pushdir1 = File::Find::Rule->directory->in('/tmp/dirx'); 
my @pushdir2 = File::Find::Rule->directory->in('/tmp/nextdir'); 
my @pushdir3 = File::Find::Rule->directory->in('/tmp/pushdir'); 
my @pushdir4 = File::Find::Rule->directory->in('/tmp/logdir'); 
my @pushdir5 = File::Find::Rule->directory->in('/tmp/testdir'); 

push @pushdir, @pushdir1,@pushdir2,@pushdir3,@pushdir4,@pushdir5; 

my @Files; 
foreach my $dir (@pushdir) { 
    push @Files, sort glob "$dir/*.txt"; 
} 

回答

1

使用子程序:

#!/usr/bin/env perl 

use strict; 
use warnings; 
use File::Find::Rule; 

my @dirnames = qw(dirx temp_dir testdir nextdir); 
my @dirs_to_search = map { "/tmp/$_" } @dirnames; 
my @files; 
for my $dir (@dirs_to_search) { 
    push @files, find_files_in_dir($dir); 
} 

sub find_files_in_dir { 
    my ($dir) = @_;  
    my @subdirs = File::Find::Rule->directory->in($dir);  
    my @txt_files; 
    for my $subdir (@subdirs) { 
     push @txt_files, sort glob "$subdir/*.txt"; 
    } 
    return @txt_files; 
} 
+0

对不起,一个小小的变化。目录结构是'/ tmp/dirx','/ tmp/temp_dir','/ tmp/testdir','/ tmp/nextdir'。如果它不以'/tmp/dir1..5'结尾,如何改变?我编辑了原始问题。谢谢 。 – bsd

+0

太棒了。有用 。谢谢 – bsd

+0

我怀疑OP是在寻求一种避免枚举'/ tmp'的子目录的方法。据我所知,您的解决方案与OP的代码完全相同,但将部分流程抽象为子流水线使得它不太清晰 – Borodin

0

这听起来像你想包含在/tmp孩子目录中的所有*.txt文件及其后裔的名单

这是很容易与一个做glob致电,就这样

my @files = glob '/tmp/**/*.txt' 
相关问题