Perl переименовывает папки и файлы с помощью File :: Find - PullRequest
0 голосов
/ 25 июня 2010

Я использую этот код для обработки моих папок и файлов с двумя подпрограммами:
"подпапки" только для имен папок
"подпапки" для имен файлов только с расширениями

НоЯ понял, что «подпапки» портятся с моими файлами с расширениями во время процесса переименования.

Как отличить процессы друг от друга или как разумно сказать «подпапкам» переименовать «имена» без расширения и «подфайлам» переименовать «имена» с расширением?

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 Ответ

1 голос
/ 25 июня 2010

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...