Perl使用File :: Find重命名文件夹和文件

时间:2010-06-25 13:37:42

标签: perl

我正在使用此代码处理我的文件夹和带有两个子文件的文件:
仅用于文件夹名称的“子文件夹” 仅用于扩展名的文件名的“子文件”

但我意识到“子文件夹”会在重命名过程中混淆带有扩展名的文件。

如何区分流程,或者说“子文件夹”重命名没有扩展名的“名称”和“子文件”以重命名“姓名”的智能方法是什么?

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 个答案:

答案 0 :(得分:1)

File :: Find :: find()为每个文件和文件夹调用您的sub。如果您只想影响文件夹,请忽略文件:

你需要调用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: $!";
}, ".");

在文件sub中,我会做出第一个声明:

return unless -f;