2015-09-05 34 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' 
相關問題