2010-06-25 153 views
0

我使用這個代碼來處理我的文件夾和文件有兩個替補:用於與擴展文件名的文件夾名稱僅
「子文件」
「子文件夾」只有Perl的重命名文件夾和文件文件::查找

但我意識到「子文件夾」在重命名過程中與我的文件擴展混淆。

如何區分進程彼此,或者什麼是告訴「子文件夾」重命名「名稱」沒有擴展名和「子文件」重命名「名稱」與externsion的智能方式?

find(\&folders, $dir_source); 
sub folders { 
    my $fh = $File::Find::dir; 
    my $artist = (File::Spec->splitdir($fh))[3];   

    if (-d $fh) { 
     my $folder_name = $_; 

     # some substitution 

     rename $folder_name, $_; 
    } 
} 


find(\&files, $dir_source); 
sub files { 
    /\.\w+$/ or return; 
    my $fn = $File::Find::name; 

    my ($genre, $artist, $boxset, $album, $disc); 
    if ($fn =~ /Singles/ or $fn =~ /Box Set/) { 
     ($genre, $artist, $boxset, $album, $disc) = (File::Spec->splitdir($fn))[2..6]; 
    } 
    else { 
     ($genre, $artist, $album, $disc) = (File::Spec->splitdir($fn))[2..5]; 
    } 

    if (-e $fn) { 
     my $file_name = $_; 

     # some substitution 

     rename $file_name, $_; 
    } 
} 

回答

1

File :: Find :: find()調用每個文件和文件夾的子集。如果你只想影響文件夾,那麼忽略文件:

而你需要調用finddepth()而不是find(),因爲你正在改變目錄名稱(你要重命名「更深」更「淺」之前的目錄)。

finddepth(sub { 
    return unless -d; 

    (my $new = $_) =~ s/this/that/ or return; 
    rename $_, $new or warn "Err renaming $_ to $new in $File::Find::dir: $!"; 
}, "."); 

替代多個換人:

finddepth(sub { 
    return unless -d; 

    my $new = $_; 
    for ($new) { 
    s/this/that/; 
    s/something/something_else/; 
    } 
    return if $_ eq $new; 

    rename $_, $new or warn "Err renaming $_ to $new in $File::Find::dir: $!"; 
}, "."); 

而且在文件子,我會做的第一條語句:

return unless -f; 
+0

你的建議是真棒毫無疑問。我只有很難通過幾個 my $ new; ($ new = $ _)=〜s /某事/其他/返回; ,因爲它只適用於一個。 – thebourneid 2010-06-25 16:29:08

+0

不確定你的意思。你想對同一個變量做幾個s ///,如果它們中的任何一個改變了值,就重命名它們? – runrig 2010-06-25 16:36:29

+0

是的。在我的完整代碼中,我有10-15秒///,並且如果有任何人在ANYWHERE遇到任何文件夾 - 重命名。但是我猜想當添加「或者返回」時 - 如果沒有滿足要求,它會停止處理。我對麼? – thebourneid 2010-06-25 16:43:32