【问题标题】:Perl Rename Folders And Files With File::FindPerl 使用 File::Find 重命名文件夹和文件
【发布时间】:2010-06-26 03:20:22
【问题描述】:

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

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

如何区分进程,或者告诉“子文件夹”重命名不带扩展名的“名称”和“子文件”重命名带有扩展名的“名称”的智能方法是什么?

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, $_;
     }  
 }

【问题讨论】:

    标签: perl


    【解决方案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: $!";
    }, ".");
    

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

    return unless -f;
    

    【讨论】:

    • 毫无疑问,您的建议很棒。我只是很难通过几个 $new; ($new = $_) =~ s/something/something else/ 或返回;因为它只在一个时起作用。
    • 不确定你的意思。您想对同一个变量执行多个 s/// 并在其中任何一个更改值时重命名?
    • 是的。在我的完整代码中,我有 10-15 秒///,如果在任何文件夹中的任何地方遇到其中任何一个 - 重命名。但我猜当添加“或返回”时 - 如果不满足某些要求,它会停止处理。我说的对吗?
    • 是的。现在像魅力一样工作(((:谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 2018-04-14
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    相关资源
    最近更新 更多