2010-06-24 80 views
0

我使用此代碼來移動目錄中的文件,但我需要做出2個更改,並希望得到一些幫助。Perl移動文件

我想 「回報,除非」 找到的目錄/^_ TEMP \ Z/s包含線索& & TOC & & accurip & & FLAC文件。如果其中一個擴展名缺失,請轉到下一個目錄。

如果此條件成立 - 從DIR移動文件,'。'目錄複製到$ dir_dump,但複製了父文件夾,並且第一個父文件夾包含「Disc \ d」以複製第二個父文件夾並移動$ dir_dump \ $ parent_folder \ $光盤。

find(\&temp, $dir_target); 
sub temp { 
my $dir_dump = "E:/_dump/"; 
my ($dev,$ino,$mode,$nlink,$uid,$gid); 
return unless ((($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) && -d _ && /^\_temp\z/s); 
    chdir($File::Find::dir) or die "could not cd to $File::Find::dir: $!"; 
    # mv files from cur dir to $dir_dump 
    opendir DIR, '.' or die "could not open dir: $!"; 
    my @files = grep m{\.(?:accurip|cue|flac|log|toc|wv)\z}, readdir DIR; 
    closedir DIR; 
foreach my $file (@files) { 
    mv $file, $dir_dump or die "could not mv $file to $dir_dump: $!"; 
} 
# mv files from temp to cur dir 
    opendir DIR, '_temp' or die "could not open temp dir: $!"; 
@files = grep m{\.(?:accurip|cue|flac|toc)\z}, readdir DIR; 
    closedir DIR; 
foreach my $file (@files) { 
    mv "_temp/$file", '.' or die "could not mv $file from _temp: $!"; 
} 
finddepth(sub{rmdir},'.'); 
} 

回答

1

要檢查目錄包含了所有4個擴展名的文件,你可以這樣做:

my @dir_files = readdir DIR; # after you did opendir 
my %extensions = map { (/\.([^.]+)$/)=> 1 } @dir_files; 
foreach my $required_ext (qw(accurip cue flac toc)) { 
    return unless $extensions{$required_ext}; 
} 

我必須承認,我不是很瞭解你的第二個要求,對不起。可能你可以提供例子嗎?

+0

它的工作。非常感謝您的幫助。 – thebourneid 2010-06-24 23:28:49

+0

@thebourneid - 不客氣。如果有幫助,可以點擊向上箭頭旁邊的向上箭頭以獲得滿意的結果:) – DVK 2010-06-24 23:54:25