2

Мне нужно очистить кучу имен файлов папок. Возможно, даже названия файлов. В настоящее время я использовал этот скрипт на Perl, но столкнулся с некоторыми проблемами.

  1. Если имя файла уже содержит круглые скобки в течение года, он добавляет еще один набор.
  2. Я хотел бы также использовать текстовый файл для удаления общих "подписей" в заголовках, напр. This.Movie.Blah.(2012) [1080p] MP4 .

    На данный момент скрипт у меня заменяет . с пробелом, как предполагалось, и добавляет (xxxx) в течение года. В результате выполнения сценария будет This Movie Blah ((2012)) [1080p] MP4 .

Также я хотел бы удалить "подписи", которые соответствуют значениям текстовых файлов (с подкладкой, а не CSV) из имени файла, так что This.Movie.Blah.(2012) [1080p] MP4 вернет This Movie Blah (2012)

use warnings;
use strict;
use File::Copy;

my $oldname;

opendir(my $d, ".") or die $!;
while(readdir $d) {
    if (-d $_ and $_ ne "." and $_ ne "..")
    {
        $oldname = $_;
        $_ =~ s/\./ /g;
        $_ =~ s/(\d{4})/($1)/g;
        move($oldname,$_);
    }
    }
closedir $d;

Я только начал пытаться изучать Perl сегодня как один из моих первых языков программирования, поэтому я относительно новичок в этом языке.

1 ответ1

0

Что касается регулярных выражений (поиск текста по шаблонам и замена на их основе), это не сложно; Я удивлен, что нет ответов после 15 часов.  Я не настолько опытен в Perl, как хотелось бы, но простой подход к проблеме год в скобках состоит в том, чтобы просто обнаружить ее потом и потом исправить:

        $_ =~ s/(\d{4})/($1)/g;
        $_ =~ s/(\((\d{4})\))/$1/g;

Второе утверждение ищет ((2012)) и возвращает средние шесть символов; т. е. (2012) .  Что касается «общих подписей», как насчет

        $_ =~ s/ \[1080p\] MP4$//;

?   (Используйте \[ и \] чтобы предотвратить интерпретацию […] как диапазона, а $ для обозначения конца строки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .